首页 新闻 会员 周边

给窗口配置单独的鼠标或键盘操作

0
悬赏园豆:50 [待解决问题]

现在实现的功能是可以在指定的窗口上,但是我不希望这些操作会影响到主线程的鼠标和键盘,同时也不能影响到其他应用程序的鼠标和键盘操作,这样该如何去实现

映浮华的主页 映浮华 | 初学一级 | 园豆:92
提问于:2023-03-02 20:18
< >
分享
所有回答(5)
0

放到其他机子上运行

jzblive | 园豆:428 (菜鸟二级) | 2023-03-02 22:31
0

扒一下vmware咋实现的,他的虚拟机可以和主机各用一套键鼠

echo_lovely | 园豆:1437 (小虾三级) | 2023-03-03 08:38
0

你可以使用Python的第三方库pyHook和pyWin32来实现窗口的鼠标和键盘操作的控制。

具体步骤如下:

安装pyHook和pyWin32库。
pip install pyHook
pip install pywin32
使用pyHook来监听窗口的鼠标和键盘事件。
import pythoncom
import pyHook

def on_keyboard_event(event):
# 处理键盘事件
return True

def on_mouse_event(event):
# 处理鼠标事件
return True

创建钩子管理器

hm = pyHook.HookManager()

监听键盘事件

hm.KeyDown = on_keyboard_event
hm.KeyUp = on_keyboard_event

监听鼠标事件

hm.MouseLeftDown = on_mouse_event
hm.MouseLeftUp = on_mouse_event
hm.MouseRightDown = on_mouse_event
hm.MouseRightUp = on_mouse_event

设置钩子

hm.HookKeyboard()
hm.HookMouse()

进入消息循环

pythoncom.PumpMessages()
使用pyWin32来设置窗口的属性,使窗口能够接收鼠标和键盘事件。
import win32gui
import win32con

获取窗口句柄

hwnd = win32gui.FindWindow(None, "窗口标题")

设置窗口为前台窗口

win32gui.SetForegroundWindow(hwnd)

设置窗口为可接收鼠标和键盘事件

win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE, win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE) | win32con.WS_EX_TRANSPARENT | win32con.WS_EX_LAYERED)
win32gui.SetLayeredWindowAttributes(hwnd, 0, 255, win32con.LWA_ALPHA)

进入消息循环

pythoncom.PumpMessages()
这样,你就可以在指定的窗口上实现单独的鼠标和键盘操作,而不会影响到主线程的鼠标和键盘,也不会影响到其他应用程序的鼠标和键盘操作。

魔露西 | 园豆:616 (小虾三级) | 2023-03-06 14:50
0


谢谢回答,基本的已经解决了,不过还是会有点小问题

映浮华 | 园豆:92 (初学一级) | 2023-03-06 19:43
0

你可以通过Windows API来实现给窗口配置单独的鼠标和键盘操作。具体来说,你可以使用SetWindowsHookEx函数来安装一个钩子(hook),这个钩子会在指定窗口的消息队列中插入一个钩子过程(hook procedure),这个过程会接收该窗口的鼠标和键盘消息,并将它们从主线程的消息队列中移除,以防止它们被传递到其他应用程序。

以下是一个简单的示例代码,它使用WH_MOUSE和WH_KEYBOARD来安装一个钩子,然后将钩子过程与指定窗口关联。你可以在钩子过程中添加自己的代码来处理窗口的鼠标和键盘消息。

java

import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef.HMODULE;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinUser;

public class WindowHook {

private HMODULE hMod;
private HOOKPROC hookProc;
private int threadId;
private HWND hWnd;

public void setHook() {
    hWnd = User32.INSTANCE.FindWindow(null, "Window Title"); // 替换成你想要操作的窗口标题
    if (hWnd == null) {
        throw new RuntimeException("Window not found");
    }

    hMod = Kernel32.INSTANCE.GetModuleHandle(null);

    hookProc = new HOOKPROC() {
        @Override
        public LRESULT callback(int nCode, WPARAM wParam, LPARAM lParam) {
            // 在这里添加自己的代码来处理鼠标和键盘消息
            // 如果要阻止消息传递到其他应用程序,可以返回1,否则返回CallNextHookEx
            return User32.INSTANCE.CallNextHookEx(null, nCode, wParam, lParam);
        }
    };

    threadId = Kernel32.INSTANCE.GetCurrentThreadId();
    User32.INSTANCE.SetWindowsHookEx(WinUser.WH_MOUSE, hookProc, hMod, threadId);
    User32.INSTANCE.SetWindowsHookEx(WinUser.WH_KEYBOARD, hookProc, hMod, threadId);
}

public void unhook() {
    User32.INSTANCE.UnhookWindowsHookEx(hook);
}

}
需要注意的是,安装钩子是一个系统级别的操作,如果你的应用程序需要管理员权限才能运行,那么你需要以管理员身份运行你的程序。

Technologyforgood | 园豆:5675 (大侠五级) | 2023-03-30 19:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册