正如楼上给出的链接,我也比较推荐通过消息钩子实现系统热键信息的拦截
键盘相关的消息主要处理:
两者区别是,后者相对前者比较底层,一般情况处理后者消息就可以实现大多数系统键盘消息的拦截了
钩子的涉及两个系统的API
钩子安装了,最关键的就是实现拦截后的处理函数,在处理函数内部你可以实现消息的过滤,修改,下发等,例如:
private static IntPtr KeyboardHookHandler(int nCode, IntPtr wParam, ref KBHookStruct lParam) { if(nCode == 0 ){ //拦截处理,过滤某些关键key等,例如: Alt+tab if( ((lParam.vkCode == 0x09) && (lParam.flags == 0x20))) { return new IntPtr(1); } //例如处理:Alt + F4 > lParam.vkCode=0x73 , lParam.flags == 0x20 //ctrl + esc > lParam.vkCode = 0x1b , lParam.flags == 0x00 //其他组合热键可以通过查找对象的vkcode和flags标识实现 } //钩子其实是个链式结构,所以需要下发传递,避免其他可能安装的钩子功能被影响 //hookPtr是SetWindowsHookEx返回的钩子句柄 return CallNextHookEx(hookPtr, nCode , wParam , ref lParam); }
钩子的实现其实有很多种的,一种DLL注入,一种是上面提到的通过C++编写个DLL然后C#调用的,但是对于C#er的话也可以直接在用C#开发全局钩子.关于具体实现,可以参考codeproject上面的一些文章,codeproject有一些封装好的C# hook库和不少全局hook的例子