我终于找到了符合我要求的解决方案。 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+ 库,因为我在获取输入时没有问题。