Respond to keyboard when not in focus? (C#, Vista)

霸气de小男生 提交于 2019-12-21 05:13:05

问题


I'm trying to write an application that responds whenever the Shift key is pressed, no matter what application currently has focus.

I tried this with SetWindowsHookEx() and with GetKeyboardState(), but both of these only work when the application's window has focus. I need it to work globally.

How do I do this?


回答1:


You'll have to use SetWindowsHookEx(). There are only two types of hooks that you can implement in a managed language, WH_KEYBOARD_LL and WH_MOUSE_LL. All other hooks require a DLL that can be injected into another process. Managed DLLs cannot be injected, the CLR cannot be initialized.

This blog post has a functional example.




回答2:


None of the provided answers helped me solve my problem, but I found the answer myself. Here it is.

Using SetWindowsHookEx() with WH_KEYBOARD_LL was the correct approach. However, the other parameters to SetWindowsHookEx() are unintuitive:

  • The last parameter, dwThreadId, needs to be 0.
  • The second-last parameter, hMod, needs to point to some DLL. I used User32, which is a DLL that is always loaded anyway and is used by all processes with a GUI. I got this idea from a CodeProject post about this.

Thus, the code looks a bit like this:

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

The documentation is unclear about the second-last parameter. It says:

The hMod parameter must be set to NULL [...] if the hook procedure is within the code associated with the current process.

It doesn't state that this only applies to some types of hooks, but not to WH_KEYBOARD_LL and WH_MOUSE_LL.




回答3:


If you use the technique in the post referenced by nobugz, you will need to make sure the delegate doesn't get garbage-collected, e.g. by using GC.KeepAlive(_proc) when setting the hook, otherwise after an indeterminate period the hook will stop working when the delagate gets GCed.




回答4:


Setup a CBT hook look here http://www.codeproject.com/KB/DLL/keyboardhook.aspx



来源:https://stackoverflow.com/questions/526458/respond-to-keyboard-when-not-in-focus-c-vista

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!