首页 新闻 会员 周边 捐助

C#如何使用代码禁用系统热键

0
悬赏园豆:100 [待解决问题]

C#如何使用代码禁用系统热键(del+alt+ctrl、window、alt+tab),求答,越详细越好。谢谢啦

郑海潮的主页 郑海潮 | 初学一级 | 园豆:76
提问于:2015-08-05 10:00
< >
分享
所有回答(2)
0
✎﹏ℳ๓₯㎕ღ | 园豆:1499 (小虾三级) | 2015-08-05 10:06
0

正如楼上给出的链接,我也比较推荐通过消息钩子实现系统热键信息的拦截

键盘相关的消息主要处理: 

  • WH_KEYBOARD 
  • WH_KEYBOARD_LL

两者区别是,后者相对前者比较底层,一般情况处理后者消息就可以实现大多数系统键盘消息的拦截了

钩子的涉及两个系统的API

  • SetWindowsHookEx      用于钩子的安装,第一个参数就是拦截的消息类型,第二个是拦截后处理函数,第三表示全局还是局部(所有应用还是指定应用)
  • UnhookWindowsHookEx 钩子的卸载(安装钩子后如果不卸载,尤其是全局安装下,在不卸载情况下可能导致一些其他应用键盘处理不正确的问题)
  • CallNextHookEx 用于下发钩子,因为通过setXX安装的钩子是呈链式结构的,可能多个应用在上面安装了同类型消息的钩子,为了避免其他应用挂钩的功能被影响需要向下传递.

钩子安装了,最关键的就是实现拦截后的处理函数,在处理函数内部你可以实现消息的过滤,修改,下发等,例如:

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的例子

visonme | 园豆:1674 (小虾三级) | 2015-08-05 10:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册