【问题标题】:SetWindowsHookEx(WH_KEYBOARD) only yields first event, sequential eventsSetWindowsHookEx(WH_KEYBOARD) 只产生第一个事件,顺序事件
【发布时间】:2011-03-10 18:48:58
【问题描述】:

我希望从 .net 应用程序全局捕获所有键盘事件。

我使用 win32 方法 SetWindowsHookEx(WH_KEYBOARD, HINSTANCE) 设置了回调。 (使用 dllimport 和一些 mashall-call。)

第一个键被按下时,我得到一个很好的响应,说明按下了哪个键。
我的回调函数按原样调用CallNextHookEx
但是在第一个事件之后,我就没有更多的事件了。

有人知道事件停止发生的常见原因吗?

【问题讨论】:

  • 最常见的原因是代码中的错误。
  • @Erik,不是真的......看我的回答。
  • 我自己没有构建该功能,而是使用了这个:codeproject.com/KB/cs/globalhook.aspx
  • 我实际上也尝试过使用那个库。但是后来我遇到了一个不同的问题。在我的 Win7-64 位二击键上,像 ü ñ 开始失效,变成 ¨u、^u 和 ~n。但这可能是一个不同的问题......
  • 你应该注意的一件事是,从个人经验来看,大多数人使用 WH_KEYBOARD_LL 的地方都弄错了,要么他们没有足够快地为请求提供服务,要么服务它的线程死了,要么跨上下文的东西只是随机播放。如果我想要一些非常强大且影响最小的东西,我会在这里不受约束。注入 dll 或设备驱动程序都是重量更轻的选项。

标签: c# winapi interop


【解决方案1】:

WH_KEYBOARD 不受托管包装器的支持,它需要将自己注入到进程中。

您可以使用WH_KEYBOARD_LL,它将在声明线程中调用。

见:http://support.microsoft.com/kb/318804

不支持全局挂钩 .NET Framework 除外 WH_KEYBOARD_LL 低级钩子和 WH_MOUSE_LL 低级钩子,你不能 在 微软 .NET 框架。安装一个 全局钩子,一个钩子必须有一个本地的 DLL 导出以将自身注入另一个 需要有效的过程, 要调用的一致函数。这 行为需要 DLL 导出。这 .NET Framework 不支持 DLL 出口。托管代码没有概念 函数值一致 指针,因为这些函数 指针是构建的代理 动态的。

调用低级钩子程序 在安装钩子的线程上。 低级钩子不需要 钩子程序在一个 动态链接库。

【讨论】:

    【解决方案2】:

    如果您的挂钩回调函数返回时间过长,Windows 将停止调用它以保持系统性能。尝试对 OutputDebugString 和 CallNextHookEx 的简单调用,看看是否有帮助...

    【讨论】:

    • 好主意!不幸的是,我的日志声称它只需要几毫秒。所以肯定是有其他原因造成的。
    猜你喜欢
    • 2021-11-21
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多