.net中没有提供system-wide hot key的处理类,注册和释放热键需要使用Win32的两个API,原型如下
hWnd是一个窗体句柄,按下热键时,Windows会把一个WM_HOTKEY消息发送给这个窗体处理过程,我们需要在窗体处理过程中处理
WM_HOTKEY消息,加入响应代码,hWnd也可以为NULL,这时候就需要在进程的消息循环中处理WM_HOTKEY
id是热键id,注意这个id是需要我们去主动生成的,Windows会在在WM_HOTKEY的WParam中放置这个热键id,这样响应代码可以根据WParam也就是热键id对同一窗体的不同热键作出区别处理,此外UnregisterHotKey也需要这个热键id(必须一致,不能R是3而U给4)作为参数进行相应热键的释放
fsModifiers用于指示功能键组合
vk键代码
热键id是RegisterHotKey和UnregisterHotKey之间的桥梁,只是与文件句柄不同,这个id是手工生成的
在C#中Import这两个API后可以直接调用,在Form中用一个成员保存热键id即可,不过这里给出一个参考pInvoke上的封装类,这个类很好的展示了Invoke在自定义类中的应用
在以上类定义中,在Form的操作都被封装在了委托里,然后Form.Invoke,这样的类的线程安全的,此外R和U这两个API应该是不用try的,在测试过程中并没有发现会抛出异常的情况。
以下是调用代码
参考资料:
RegisterHotKey Function ()
http://msdn.microsoft.com/en-us/library/ms646309(VS.85).aspx
pinvoke.net RegisterHotKey (user32)
http://www.pinvoke.net/default.aspx/user32/RegisterHotKey.html