不在焦点时响应键盘? (C#,Vista)

时间:2009-02-08 21:36:26

标签: c# windows windows-vista

我正在尝试编写一个应用程序,只要按下Shift键就会响应,无论当前哪个应用程序都有焦点。

我尝试使用SetWindowsHookEx()GetKeyboardState(),但这两种方法仅在应用程序窗口具有焦点时才起作用。我需要它在全球范围内工作。

我该怎么做?

4 个答案:

答案 0 :(得分:5)

您必须使用SetWindowsHookEx()。您可以使用托管语言WH_KEYBOARD_LL和WH_MOUSE_LL实现两种类型的挂钩。所有其他挂钩都需要一个可以注入另一个进程的DLL。无法注入托管DLL,无法初始化CLR。

blog post有一个功能示例。

答案 1 :(得分:5)

所提供的答案都没有帮助我解决我的问题,但我自己找到了答案。在这里。

SetWindowsHookEx()WH_KEYBOARD_LL一起使用是正确的方法。但是,SetWindowsHookEx()的其他参数不直观:

  • 最后一个参数dwThreadId必须为0.
  • 倒数第二个参数hMod需要指向某个DLL。我用了 User32,这是一个始终加载并被所有人使用的DLL 使用GUI进行处理。我从a CodeProject post about this获得了这个想法。

因此,代码看起来有点像这样:

instance = LoadLibrary("User32");
hhook = SetWindowsHookEx(WH_KEYBOARD_LL, hookFunction, instance, 0);

关于倒数第二个参数的文档不清楚。它说:

  

如果挂钩过程在与当前进程关联的代码中,则hMod参数必须设置为NULL [...]。

它并未声明这仅适用于某些类型的挂钩,而不适用于WH_KEYBOARD_LLWH_MOUSE_LL

答案 2 :(得分:2)

如果您在nobugz引用的帖子中使用该技术,则需要确保委托不会被垃圾收集,例如通过在设置挂钩时使用GC.KeepAlive(_proc),否则在不确定的时间段后,当delagate获得GC时,挂钩将停止工作。

答案 3 :(得分:1)