我正在尝试编写一个应用程序,只要按下Shift键就会响应,无论当前哪个应用程序都有焦点。
我尝试使用SetWindowsHookEx()
和GetKeyboardState()
,但这两种方法仅在应用程序窗口具有焦点时才起作用。我需要它在全球范围内工作。
我该怎么做?
答案 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_LL
和WH_MOUSE_LL
。
答案 2 :(得分:2)
如果您在nobugz引用的帖子中使用该技术,则需要确保委托不会被垃圾收集,例如通过在设置挂钩时使用GC.KeepAlive(_proc),否则在不确定的时间段后,当delagate获得GC时,挂钩将停止工作。
答案 3 :(得分:1)