我正在编写一个跨平台的应用程序,在某种情况下可以控制所有用户输入一段时间。
在GNU / Linux上,我使用了gtk +,它允许我检索鼠标和键盘事件,如移动或按下。当我的应用程序响应它们时,我需要这些东西。它还有一个用gtk +创建的小图形界面。
我一直试图在Windows上抓取鼠标输入而没有成功,因为gtk在图形上运行良好,但不会抓取用户输入。我尝试过使用BlockIntput(),但它没有按预期工作,因为:
有没有办法在Windows上抓取鼠标和键盘输入,仍然可以在没有管理权限的情况下读取输入?
答案 0 :(得分:1)
我终于找到了符合我要求的解决方案。 Marc的一个链接引导我在Windows上使用钩子,我已经尝试过但没有成功,但我最终实现了它们用于键盘和鼠标抓取。
我的Windows代码使用Windows库,当我需要阻止输入时,我创建了一个调用函数的线程:
DWORD dwThread;
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MouseHooker, NULL, 0, &dwThread);
然后我安装了钩子:
DWORD WINAPI MouseHooker(LPVOID lpParameter) {
HINSTANCE hExe = GetModuleHandle(NULL);
//The thread's parameter is the first command line argument which is the path to our executable.
if (!hExe) //If it fails we will try to actually load ourselves as a library.
hExe = LoadLibrary((LPCSTR) lpParameter);
if (!hExe)
return 1;
//Install the hook as a low level mouse hook thats calls mouseEvent
hMouseHook = SetWindowsHookEx (WH_MOUSE_LL, (HOOKPROC)MouseEvent, hExe, 0);
...
UnhookWindowsHookEx(hMouseHook);
return 0;
}
在每个鼠标事件代码被调用:
if (nCode == HC_ACTION && ...) { //HC_ACTION means we may process this event, we may add specific mouse events
//We block mouse input here and do our thing
}
//return CallNextHookEx(hKeyHook, nCode, wParam, lParam);
return 1;
因为我们没有继续使用钩链输入,所以永远不会处理并且工作站被阻塞。
代码按预期在Windows 7上运行。我一直在Windows上使用gtk +,因为我仍然可以生成我的GUI并使用gdk检索鼠标输入。 在GNU / Linux上,代码只能使用GTK +库,因为我在获取输入时没有任何问题。