【问题标题】:Can I use Global Hooks and Raw Input at the same time?我可以同时使用全局挂钩和原始输入吗?
【发布时间】:2011-04-13 05:21:44
【问题描述】:

我尝试使用 SetWindowsHookEx 使用 Global Hooks 来获取所有击键。

问题是我不能同时使用全局挂钩和原始输入。

我认为这里一定存在一些问题,因为在我启用原始输入后全局挂钩会自动被禁用。

【问题讨论】:

  • 我可以在不使用 setwindowex() 的情况下仅使用原始输入来更改击键吗??

标签: .net winapi hook keyboard-hook setwindowshookex


【解决方案1】:

谁告诉你它们需要一起使用?如果您的应用程序注册为处理原始输入,则绝对没有理由安装全局挂钩。原始输入模型的重点是让应用程序接收通知并处理来自连接到计算机的任何 HID 的原始输入。

相反,您侦听WM_INPUT message,它会针对您通过调用RegisterRawInputDevices function 注册的任何HID 发送到应用程序的消息队列。收到此消息后,您的应用程序应使用WM_INPUT 消息的lParam 参数中包含的RAWINPUT 句柄调用GetRawInputData function。示例代码可用here

或者,您可以对原始数据进行缓冲读取。这对于一次生成大量输入的设备更有用。使用这种方法,您调用GetRawInputBuffer function,它返回一个RAWINPUT 结构的数组。同样,示例代码可用here

原始输入函数的主题阅读是here on MSDN

【讨论】:

  • 我之前使用 gloabalhook 更改了一些键盘键,现在我想使用原始输入来获取输入设备的名称(知道哪个发送数据)。但是当我使用 rawinput 时,全局 Hooks 被禁用!跨度>
  • @raha:我不明白你在说什么,我不确定我的答案能说得清楚多少。原始输入和全局钩子不兼容,你没有理由需要一起使用它们。如果您已将应用注册为从设备接收原始输入,则不需要全局挂钩。您将通过WM_INPUT 消息收到输入通知。它们发生在完全不同的层面。原始输入在全局挂钩之前得到处理。
  • 我可以用原始输入挂钩键盘吗?所以当我使用 rawinput 时,我永远无法挂钩键盘?对吗?
  • @raha:关键是注册您的应用程序以接收来自设备的原始输入在功能上等同于安装全局挂钩。每次设备将输入发送到计算机时,您都会收到WM_INPUT 消息,就像您安装全局挂钩时会收到通知一样。唯一的区别是您收到的输入的级别(原始)低于来自全局挂钩的输入。没有理由挂上键盘,当你收到原始输入通知时,你已经知道了。
  • 对不起,我认为我没有完全理解它,让我告诉你为什么我使用键盘挂钩。我得到一个像 A 的键并发送 B 而不是那个(如果 e.KeyCode==keys. A System.Windows.Forms.SendKeys.Send(B);) 对于这个目的,我首先应该挂钩 A。
【解决方案2】:

对于已由 LRESULT WindowProcedure 回调检查的原始输入,您不需要挂钩。如果使用了 mouse_pos、mouse_click(以及您可以通过计数器确定的点击次数)、key_input 等设备,您只需获取信息...

【讨论】:

    猜你喜欢
    • 2016-12-14
    • 1970-01-01
    • 2014-08-01
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    相关资源
    最近更新 更多