【问题标题】:How to grab mouse on Windows如何在 Windows 上抓取鼠标
【发布时间】:2014-12-03 01:36:29
【问题描述】:

我正在编写一个跨平台应用程序,它在一定条件下会在一段时间内控制所有用户输入。

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

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

  1. 我需要管理员权限才能运行应用程序
  2. 我无法读取鼠标或键盘输入

有没有办法在窗口上抓取鼠标和键盘输入,并且仍然能够在没有管理权限的情况下读取它们的输入?

【问题讨论】:

标签: c windows gtk cross-platform mouse


【解决方案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+ 库,因为我在获取输入时没有问题。

【讨论】:

  • 您能否展示一个纯 C 示例如何捕获键盘输入?
猜你喜欢
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
相关资源
最近更新 更多