在没有焦点时对键盘做出响应? (C#,Vista)

我试图编写一个应用程序,无论什么应用程序当前有焦点,每当按下Shift键时都会作出响应。

我尝试了SetWindowsHookEx()GetKeyboardState() ,但是这两个只在应用程序的窗口有焦点时才起作用。 我需要它在全球范围内工作。

我该怎么做呢?

Solutions Collecting From Web of "在没有焦点时对键盘做出响应? (C#,Vista)"

你将不得不使用SetWindowsHookEx()。 只有两种类型的钩子可以用托管语言WH_KEYBOARD_LL和WH_MOUSE_LL来实现。 所有其他钩子都需要一个可以注入另一个进程的DLL。 被管理的DLL不能被注入,CLR不能被初始化。

这篇博文有一个功能性的例子。

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

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

  • 最后一个参数dwThreadId必须是0。
  • 倒数第二个参数hMod需要指向某个DLL。 我使用了User32 ,这是一个总是加载的DLL,并被所有的GUI使用。 我从一个CodeProject的帖子中得到了这个想法。

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

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

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

如果钩子程序在与当前进程关联的代码中,hMod参数必须设置为NULL。

它没有说明这只适用于某些类型的钩子,而不适用于WH_KEYBOARD_LLWH_KEYBOARD_LL

如果你在nobugz引用的帖子中使用了这个技巧,你需要确保这个委托没有被垃圾收集,比如在设置钩子的时候使用GC.KeepAlive(_proc),否则在一个不确定的时间段之后钩子会停止工作,当delagate得到GCed。