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

Tim*_*mwi 5 c# windows windows-vista

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

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

我该怎么做呢?

Han*_*ant 5

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

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


Tim*_*mwi 5

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

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

  • 最后一个参数dwThreadId需要为0.
  • 倒数第二个参数hMod需要指向某个DLL.我用过 User32,这是一个始终加载的DLL,并且所有进程都使用GUI.我从CodeProject的帖子中得到了这个想法.

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

instance = LoadLibrary("User32");
hhook = SetWindowsHookEx(WH_KEYBOARD_LL, hookFunction, instance, 0);
Run Code Online (Sandbox Code Playgroud)

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

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

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