CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

高手请进:源码分析win2000下的键盘锁定

楼主catgo(小猫)2002-05-20 20:40:35 在 C++ Builder / 基础类 提问

进行了以下的调用,但在win2000下却起不到锁定键盘的作用,不知何故?(win98下也不行)  
   
  #include   <windows.h>  
   
  HHOOK   OldHook=NULL;  
  HINSTANCE   hInst=NULL;  
   
  int   WINAPI   DllEntryPoint(HINSTANCE   hinst,   DWORD   dwReason,   void*)  
  {  
          if   (dwReason==DLL_PROCESS_ATTACH)  
                  hInst   =   hinst;  
          else   if(dwReason==DLL_PROCESS_DETACH)  
                  if   (OldHook)  
                          UnhookWindowsHookEx(OldHook);  
          return   1;  
  }  
   
  long   CALLBACK   KeyProc(int   code,   WPARAM   wParam,   LPARAM   lParam)  
  {  
          return   1;   //锁定任何按键。  
  }  
   
  BOOL   _export   CALLBACK   DisableKB(bool   disable)  
  {  
          if   (disable)   {  
                  if   (OldHook   ==   NULL)  
                          OldHook   =   SetWindowsHookEx(WH_KEYBOARD_LL,    
                                  (HOOKPROC)KeyProc,   hInst,   NULL);  
                  return   OldHook   !=   NULL;  
          }  
          else   {  
                  if   (OldHook   &&   UnhookWindowsHookEx(OldHook))  
                          OldHook   =   NULL;  
                  return   OldHook   ==   NULL;  
          }  
  }    
   
  //在程序中调用------------------------------  
                  bool   (CALLBACK   *DisableKB)(bool);  
                  HINSTANCE   DisableKBInst;  
   
                      if   ((DisableKBInst   =   LoadLibrary("hidkbdll.dll"))==   NULL)  
                      {  
                            ShowMessage("错误:打开库文件失败!");  
                      }  
                    else  
                    {  
   
                        DisableKB   =   (bool(CALLBACK   *)(bool))  
                                            GetProcAddress(DisableKBInst,"DisableKB");  
                        if(DisableKB)  
                        {  
                            DisableKB(true);  
                            ShowMessage("win200   键盘锁定!");  
                        }  
   
                        else  
                            ShowMessage("错误:找不到DLL中的函数!");  
                    }  
   
                    FreeLibrary(DisableKBInst); 问题点数:100、回复次数:3Top

1 楼jishiping(JSP 季世平)回复于 2002-05-20 20:52:08 得分 70

这儿你加载DLL后,又马上释放DLL了。在DLL释放时,DLL又调用了UnhookWindowsHookEx,所以就不能锁定键盘了。所以应该在不需要锁定键盘的地方调用FreeLibrary(DisableKBInst);而不是在加载DLL后马上释放DLL。Top

2 楼aawolf(羌狼)回复于 2002-05-20 20:57:29 得分 30

void   __fastcall   TForm1::Button1Click(TObject   *Sender)  
  {  
                  oldkeyhook=SetWindowsHookEx(  
                                                      WH_JOURNALRECORD,//截获键盘消息的钩子类型  
                                                      (HOOKPROC)KeyboardProc,   //钩子子程地址  
                                                      //包含钩子子程的动态链接库的地址  
                                                      //GetModuleHandle("hook.exe"),  
                                                      HInstance,  
                                                      //得到创建该窗口的线程的标识  
                                                      0   );  
   
                  if(oldkeyhook==NULL)  
                          ShowMessage("Hook   no   good");  
          }  
          /*  
              */  
  }Top

3 楼aawolf(羌狼)回复于 2002-05-20 21:01:11 得分 0

我写的是个日志钩子,但大体框架是一样的,SetWindowsHookEx和UnhookWindowsHookEx要在你的EXE里调用,而DLL是作为插入另外进程的部分,包含CALLBACK部分就对了。  
  你对钩子的概念还不太清楚。Top

相关问题

  • 有关键盘钩子函数的使用!(源码分析)
  • 模拟键盘事件 源码分析 为什么 只模拟一次 也后就无效了
  • Interbase源码分析
  • 锁定键盘
  • 操作系统源码分析网
  • 锁定键盘和鼠标
  • 为什么打不开莱昂氏UNIX源码分析!
  • 高分:求书《Linux内核源码分析》
  • 《C++ STL》和《STL源码分析》哪本好?
  • 高分求一个VB源码分析工具CodeReview?

关键词

  • win2000
  • 键盘
  • dll
  • null
  • oldhook
  • disablekb
  • disablekbinst
  • 钩子
  • 锁定
  • 调用

得分解答快速导航

  • 帖主:catgo
  • jishiping
  • aawolf

相关链接

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

广告也精彩

反馈

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