我正在尝试编写一个应用程序,只要按下Shift键就会响应,无论当前哪个应用程序都有焦点.
我尝试使用SetWindowsHookEx()
和使用GetKeyboardState()
,但这两个只在应用程序的窗口具有焦点时才起作用.我需要它在全球范围内工作.
我该怎么做呢?
你必须使用SetWindowsHookEx().您可以使用托管语言WH_KEYBOARD_LL和WH_MOUSE_LL实现两种类型的挂钩.所有其他挂钩都需要一个可以注入另一个进程的DLL.无法注入托管DLL,无法初始化CLR.
这篇博文有一个功能性的例子.
提供的答案都没有帮助我解决我的问题,但我自己找到了答案.这里是.
使用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);
关于倒数第二个参数的文档不清楚.它说:
如果挂钩过程位于与当前进程关联的代码中,则必须将hMod参数设置为NULL [...].
它并未声明这仅适用于某些类型的钩子,而不适用于WH_KEYBOARD_LL
和WH_MOUSE_LL
.