• 网络学院
  • 新手学堂
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
低级键盘钩子屏蔽Win键、Alt+Tab键的响应
广告位
  站点:
  • 首 页
  • 最新软件
  • 最新文章
  • 国内软件
  • 国外软件
  • 汉化软件
  • 源码下载
  • 字体下载
低级键盘钩子屏蔽Win键、Alt+Tab键的响应
软件发布 低级键盘钩子屏蔽Win键、Alt+Tab键的响应
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回首页 | 文章首页 | 编程技术 | PB教程 | 低级键盘钩子屏蔽Win键、Alt+Tab键的响应

低级键盘钩子屏蔽Win键、Alt+Tab键的响应

 

添加时间: 2006-2-21 21:40:51  作者: PowerBuilder教程  阅读次数:880   来源: http://www.d9soft.com

 

 

       

  如果你是基于Windows操作系统做系统集成的,你可能希望你的最终产品独占系统资源。你希望规范用户行为,比如你不希望用户通过按Ctrl+Alt+Del终止某个进程,或者按下Win键弹出开始菜单,

    或者按下Alt+Tab组合键切换到别的应用程序。笔者已有相关一篇文章《Win2K/NT下屏蔽Ctrl+Alt+Del的响应》,介绍了如何通过GINA编程接口屏蔽Ctrl+Alt+Del的响应。作为续篇,本文将继续介绍屏蔽Win键和Alt+Tab组合键的方法。  
  
  由于这些按键的响应是系统级的,我们不可能简单地通过某个程序来控制它们。因此,我们需要使用微软提供的另外一种编程接口——钩子(Hook)。大家可能已经对钩子很了解了(网上有很多介绍钩子技术和应用的文章)。简单来说,钩子是一种通过替换系统提供的标准接口来截获特定的事件(消息),最终达到改变或增强系统默认行为目的的技术。我们现在的任务,就是要在用户按下Win键或Alt+Tab组合键、但系统还没有响应之前截获它们,然后改变系统的默认行为。很显然,我们要做一个全局钩子(钩子函数放在独立的DLL中实现),而且是个低级键盘钩子(Low  Level  Keyboard    hook)。 

  第一步,钩子DLL的实现。我们首先要定义一个全局数据区(记住这是一个全局钩子),如下(放在cpp文件的上头): 

  #pragma  data_seg("mydata") 
  HHOOK            glhHook            =  NULL;                        //  安装的鼠标钩子句柄 
  HINSTANCE    glhInstance    =  NULL;              //  DLL实例句柄 
  #pragma  data_seg() 

  然后在.def文件中声明这个数据区,如下: 
  SECTIONS  
  mydata  READ  WRITE  SHARED 

  当这个DLL被某个进程载入时,程序从WinMain进入,此时我们需要把模块句柄保存下来,如下: 
  glhInstance  =  (HINSTANCE)  hModule; 

  接下去,我们就要定义两个导出函数,以及钩子的处理函数。我们重点看一下这个钩子处理函数(另外两个导出函数比较简单,只是通过调用SetWindowsHookEx和UnhookWindowsHookEx实现安装/卸载钩子函数;只需注意SetWindowsHookEx第一个参数为WH_KEYBOARD_LL,第四个参数为0)。 
  //  低级键盘钩子处理函数 
  LRESULT  CALLBACK  LowLevelKeyboardProc(int  nCode,  WPARAM  wParam,  LPARAM  lParam) 
  { 
         BOOL  fEatKeystroke  =  FALSE; 
         PKBDLLHOOKSTRUCT  p  =  NULL;  

    if  (nCode  ==  HC_ACTION)   
         { 
                 p  =  (PKBDLLHOOKSTRUCT)  lParam; 
                 switch  (wParam)   
                 { 
                         case  WM_KEYDOWN:   
                         case  WM_SYSKEYDOWN: 
                                                 case  WM_KEYUP:         
                         case  WM_SYSKEYUP:   
                 fEatKeystroke  =  (p->vkCode  ==  VK_LWIN)    ¦  ¦  (p->vkCode  ==  VK_RWIN)    ¦  ¦    //  屏蔽Win 
                 //  屏蔽Alt+Tab 
                 ((p->vkCode  ==  VK_TAB)  &&  ((p->flags  &  LLKHF_ALTDOWN)  !=  0))    ¦  ¦ 
                 //  屏蔽Alt+Esc 
                 ((p->vkCode  ==  VK_ESCAPE)  &&  ((p->flags  &  LLKHF_ALTDOWN)  !=  0))    ¦  ¦ 
                 //  屏蔽Ctrl+Esc 
                 ((p->vkCode  ==  VK_ESCAPE)  &&  ((GetKeyState(VK_CONTROL)  &  0x8000)  !=  0)); 
                 break; 
                         default: 
                                 break; 
             } 
         }  
 
  return  (fEatKeystroke  ?  TRUE  :  CallNextHookEx(glhHook,nCode,wParam,lParam)); 
  } 

  大家可以看到,当程序发现按下的是Win键或者Alt+Tab组合键,就不再调用CallNextHookEx函数将这个消息传递下去。以此,我们做到了屏蔽这些按键的响应。  
  
  第二步,钩子DLL的测试程序。在VC中创建一个基于对话框的应用程序。通过调用LoadLibrary("KeyMask.dll")载入钩子DLL,通过GetProcAddress(m_hDll,"StartKeyMask")和GetProcAddress(m_hDll,"StopKeyMask")导入两个安装/卸载钩子的函数。在主对话框上定义两个按钮分别调用这两个函数,如下:

  当按下“Start_Hook”按钮,我们的钩子函数就起作用了。试一下Win键,或者Alt+Tab组合键,没反应了吧?!“Stop_Hook”按钮可以解除这个钩子。  

  讲到这,大家可能觉得钩子其实也是很容易的东西。是的,钩子容易使用,而且功能强大。但是,笔者建议,如果不是十分必要,请尽量少用钩子。因为钩子在实现强大功能的同时,可能也会严重降低你系统的性能。有时候是得不偿失的! 

 

 

 

上下文章:

 

上一篇文章: PB中实现数据窗口动态排序的三种方法 下一篇文章: 在PB中实现系统热键功能的新方法

相关文章:

  • 盗号记录器通过钩子专盗网络游戏账号
  • 键盘的F1到F12键 你究竟会用几个
  • 深入防火墙 有效屏蔽外界的攻击
  • 解决局域网中网络邻居响应慢故障
  • 实用小技巧 电脑开机就打开小键盘

相关软件:

  • 键盘网络城市音乐 v2.0
  • 键盘网络城市音乐(含最新数据)
  • 鼠标键盘记录回放器 V2.63
  • 键盘调音量工具
  • 键盘盲打练习 V4.80
  • 键盘五笔训练助手 V8.09

 

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

编程技术分类导航

  • ASP & ASP.NET教程
  • PHP教程
  • JSP教程
  • C/C++教程
  • VB & VB.NET教程
  • VC教程
  • Delphi教程
  • BCB教程
  • VFP教程
  • PB教程
  • JAVA教程
  • XML教程
  • C#教程
  • CGI教程

本类经典文章推荐

  • 第一章 什么是PowerBuilder
  • 第二章 PowerBuilder 入门之创建新...
  • 第二章 PowerBuilder 入门之定义表...
  • 第二章 PowerBuilder 入门之向数据...
  • 第二章 PowerBuilder 入门之向表中...
  • 第二章 PowerBuilder 入门之创建第...
  • 第二章 PowerBuilder 入门之创建应...
  • 第二章 PowerBuilder 入门之创建第...
  • 第二章 PowerBuilder 入门之创建数...
  • 第二章 PowerBuilder 入门之运行应...

PB教程阅读排行

  • 第二章 PowerBuilder 入门之创建新...
  • 第一章 什么是PowerBuilder
  • 第二章 PowerBuilder 入门之定义表...
  • 第二章 PowerBuilder 入门之向数据...
  • 第二章 PowerBuilder 入门之创建第...
  • 第二章 PowerBuilder 入门之创建应...
  • 第二章 PowerBuilder 入门之向表中...
  • 第二章 PowerBuilder 入门之创建数...
  • 第二章 PowerBuilder 入门之运行应...
  • 第二章 PowerBuilder 入门之创建第...

编程技术阅读总排行

  • VB入门教程之一
  • 第二章 PowerBuilder 入门之创建新...
  • Java连接数据库实例
  • 第一章 什么是PowerBuilder
  • VC++之List Box/Check List Box控...
  • VC++ List Ctrl控件
  • VC++ Combo Box/Combo Box Ex控件
  • 学C++不得不看的一篇文章
  • VB入门教程之二
  • VC++之Button控件

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有