CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

关于键盘挂钩问题

楼主ubje(海风)2001-11-08 13:53:17 在 C++ Builder / 基础类 提问

我在编写一个键盘挂钩,在SetWindowsHookEx(int   idHook,HOOKPROC   lpfn,   HINSTANCE   hMod,DWORD   dwThreadId);中的idHook参数设为WH_KEYBOARD,但在windows2000下对Ctrl+Alt+Del和windows键不起作用。在一本书中介绍idHook参数还可以设为WH_KEYBOARD_LL(只在windows2000有用),但在CB5中不支持。有谁知道怎样挂上这两个消息。急急急 问题点数:20、回复次数:1Top

1 楼cobi(我是小新)回复于 2001-11-08 14:46:50 得分 20

怎样屏蔽系统热键    
  在程序开发过程中,为了达到一些特殊的要求,有时需要屏蔽系统热键。这些系统热键包括   Alt+Tab、Ctrl+Alt+Del、    
     
  Alt+Esc、Ctrl+Esc、Win   键等。由于屏蔽系统热键涉及到系统的安全,所以微软并不推荐这样做,我们只能在一些未公    
     
  开的文档中去探究它。下面我们分三种情况来讨论屏蔽系统热键的方法。    
  一、         在win95/win98操作系统下:    
  在win95/win98操作系统下屏蔽系统热键可以用一种非常简单的方法做到,就是让系统认为当前处于屏保状态。让系统认为当    
     
  前处于屏保状态的方法是:    
                          SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,true,&pOld,SPIF_UPDATEINIFILE);    
  SPI_SETSCREENSAVERRUNNING   该参数在微软的文档中并不建议使用,是因为在该状态下,系统无法弹出任务列表,一旦某    
     
  一进程被挂起,只能重新启动,有可能造成数据丢失,但可以达到所需效果,我们仍然使用它。    
     
  当程序要取消该状态:    
              SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,false,&pOld,SPIF_UPDATEINIFILE);    
  pOld   为我们定义的布尔变量。        
     
  二、         在WinNT   4.0   Service   Pack   3或   Win2000下    
  也许你认为使用一个键盘钩子WH_KEYBOARD不就解决问题了吗?问题并不是那么简单。这是因为键盘钩子WH_KEYBOARD并不能    
     
  截取到系统键的输入!幸好在Winnt4.0   Service   Pack3或Win2000下系统给我们提供了一个底层系统钩子(Low   Level      
     
  Hook)WH_KEYBOARD_LL。WH_KEYBOARD_LL的工作流程如右图所示:    
  从右图我们可以看到,底   层键盘钩子存在于用户敲击键盘和系统处理之间,而普通键盘钩子则存在于系统产生WM_KEYxxx之    
     
  后。很清楚,普通键盘钩子只能截获WM_KEYxxx消息,而不能对系统键进行操作。但是底层键盘钩子有一个致命的弱点,就是    
     
  如果调用它的进程或线程出现死循环,系统将不能处理任何键盘操作。为了解决这个问题,微软在注册表中给出了一个底层键    
     
  盘钩子处理的限制时间,如果超出了这个时间,系统将正常处理。这个时间的键值在注册表的HKEY_CURRENT_USER\Control      
     
  Panel\Desktop\   LowLevelHooksTimeout下给出。    
  下面我们来讨论底层键盘钩子的用法。首先需要按装钩子,这需要API函数:    
          HHOOK   SetWindowsHookEx(    
          int   iHookCode,                    
          HOOKPROC   lpfn,            
          HINSTANCE   hModule,    
          DWORD   dwThreadId    
  );    
  其中,第一个参数是钩子的类型;第二个参数是钩子函数的地址;第三个参数是包含钩子函数的模块句柄;第四个参数指定监    
     
  视的线程。如果指定确定的线程,即为线程专用钩子;如果指定为空,即为全局钩子。其中,全局钩子函数必须包含在DLL(    
     
  动态链接库)中,而线程专用钩子还可以包含在可执行文件中。得到控制权的钩子函数在完成对消息的处理后,如果想要该消    
     
  息继续传递,那么它必须调用另外一个SDK中的API函数CallNextHookEx来传递它。钩子函数也可以通过直接返回TRUE来丢    
     
  弃该消息,并阻止该消息的传递。    
              下面是实现底层键盘钩子的完整源代码,在VC5.0,VC6.0下调试通过。    
          #include   <Windows.h>    
     
          LRESULT   CALLBACK   LowLevelKeyboardProc(int   nCode,      
              WPARAM   wParam,   LPARAM   lParam)   {    
     
              BOOL   fEatKeystroke   =   FALSE;    
     
      I         f   (nCode   ==   HC_ACTION)   {    
                      switch   (wParam)   {    
                      case   WM_KEYDOWN:     case   WM_SYSKEYDOWN:    
                      case   WM_KEYUP:         case   WM_SYSKEYUP:      
                  PKBDLLHOOKSTRUCT   p   =   (PKBDLLHOOKSTRUCT)   lParam;    
                  fEatKeystroke   =      
                          ((p->vkCode   ==   VK_TAB)   &&   ((p->flags   &   LLKHF_ALTDOWN)   !=   0))   ||    
                          ((p->vkCode   ==   VK_ESCAPE)   &&      
                          ((p->flags   &   LLKHF_ALTDOWN)   !=   0))   ||    
  ((p->vkCode   ==   VK_ESCAPE)   &&   ((GetKeyState(VK_CONTROL)   &   0x8000)   !=   0));    
                  break;    
              }    
      }    
      return(fEatKeystroke   ?   1   :   CallNextHookEx(NULL,   nCode,   wParam,      
                      lParam));    
  }    
     
  /////////////////////////////////////////////////////////////////////////    
     
     
  int   WINAPI   WinMain(HINSTANCE   hinstExe,   HINSTANCE,   PTSTR   pszCmdLine,   int)   {    
     
      //按装底层键盘钩子    
      HHOOK   hhkLowLevelKybd     =   SetWindowsHookEx(WH_KEYBOARD_LL,      
              LowLevelKeyboardProc,   hinstExe,   0);    
     
      MessageBox(NULL,      
              TEXT("Alt+Esc,   Ctrl+Esc,   and   Alt+Tab   are   now   disabled.\n")    
              TEXT("Click   \"Ok\"   to   terminate   this   application   and   re-enable    
                          these   keys."),    
              TEXT("Disable   Low-Level   Keys"),   MB_OK);    
      UnhookWindowsHookEx(hhkLowLevelKybd);    
     
      return(0);    
  }Top

相关问题

  • 键盘挂钩问题
  • 如何用挂钩截获系统的键盘事件
  • 挂钩?
  • 键盘!!!!!!!!!~!!!·!
  • 键盘?
  • 键盘
  • 键盘问题
  • 键盘消息
  • 键盘钩子
  • 关于键盘

关键词

  • win2000
  • win95
  • win98
  • windows2000
  • 键盘
  • 函数
  • 系统
  • 屏蔽
  • 线程
  • 消息

得分解答快速导航

  • 帖主:ubje
  • cobi

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo