如何在Windows上抓取鼠标

时间:2014-10-08 11:44:07

标签: c windows gtk cross-platform mouse

我正在编写一个跨平台的应用程序,在某种情况下可以控制所有用户输入一段时间。

在GNU / Linux上,我使用了gtk +,它允许我检索鼠标和键盘事件,如移动或按下。当我的应用程序响应它们时,我需要这些东西。它还有一个用gtk +创建的小图形界面。

我一直试图在Windows上抓取鼠标输入而没有成功,因为gtk在图形上运行良好,但不会抓取用户输入。我尝试过使用BlockIntput(),但它没有按预期工作,因为:

  1. 我需要管理员权限才能运行该应用程序
  2. 我无法读取鼠标或键盘输入
  3. 有没有办法在Windows上抓取鼠标和键盘输入,仍然可以在没有管理权限的情况下读取输入?

1 个答案:

答案 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 +库,因为我在获取输入时没有任何问题。