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

vc实现锁住键盘鼠标

楼主donghongtao(孤灯 青卷 长眠)2005-11-10 23:37:09 在 Windows专区 / Windows NT/2000/XP/2003 提问

高手指教,老板逼的紧,写了几天都没有写出来,请高手给点提示,谢谢了 问题点数:20、回复次数:4Top

1 楼donghongtao(孤灯 青卷 长眠)回复于 2005-11-12 12:27:25 得分 0

高手指教一下啊Top

2 楼kernet(人生若只如初见,何事秋风悲画扇)回复于 2005-11-12 12:30:48 得分 0

锁定键盘要用全局钩子  
  必须写在外部dll中。  
  //lock.cpp  
  #define   _WIN32_WINNT     0x0500                                       //   设置系统版本,   确保可以使用底层键盘钩子  
  #include   "windows.h"  
  //   全局变量  
  LPDWORD               g_lpdwVirtualKey   =   NULL;                   //   Keycode   数组的指针  
   
  int                       g_nLength   =   0;                                       //   Keycode   数组的大小  
   
  BOOL                     g_bDisableKeyboard   =   FALSE;             //   是否屏蔽整个键盘  
   
  HINSTANCE           g_hInstance   =   NULL;                             //   模块实例句柄  
   
  HHOOK                   g_hHook   =   NULL;                                     //   钩子句柄  
   
     
   
  //   DLL   入口函数  
   
  BOOL   APIENTRY   DllMain(HANDLE   hModule,   DWORD     ul_reason_for_call,   LPVOID   lpReserved)  
   
  {  
   
            //   保存模块实例句柄  
   
            g_hInstance   =   (HINSTANCE)hModule;  
   
             
   
            //   在进程结束或线程结束时卸载钩子  
   
            switch   (ul_reason_for_call)  
   
            {  
   
            case   DLL_PROCESS_ATTACH:  
   
                    break;  
   
            case   DLL_THREAD_ATTACH:  
   
                    break;  
   
            case   DLL_PROCESS_DETACH:  
   
            case   DLL_THREAD_DETACH:  
   
                    delete   g_lpdwVirtualKey;  
   
                    if   (g_hHook   !=   NULL)   UnhookWindowsHookEx(g_hHook);  
   
                    break;  
   
            }  
   
          return   TRUE;  
   
  }  
   
     
   
  //   底层键盘钩子函数  
   
  LRESULT   CALLBACK   LowLevelKeyboardProc(int   nCode,   WPARAM   wParam,   LPARAM   lParam)  
   
  {  
   
            //   禁用键盘的某个按键,   如果   g_bDisableKeyboard   为   TRUE   则禁用整个键盘  
   
            if   (nCode   ==   HC_ACTION)  
   
            {  
   
                    if   (g_bDisableKeyboard)   return   TRUE;  
   
                    KBDLLHOOKSTRUCT*   pStruct   =   (KBDLLHOOKSTRUCT*)lParam;  
   
                    LPDWORD   tmpVirtualKey   =   g_lpdwVirtualKey;  
   
                    for   (int   i   =   0;   i   <   g_nLength;   i++)  
   
                    {  
   
                              if   (pStruct->vkCode   ==   *tmpVirtualKey++)  
   
                                        return   TRUE;  
   
                    }  
   
                     
   
            }  
   
             
   
            //   传给系统中的下一个钩子  
   
            return   CallNextHookEx(g_hHook,   nCode,   wParam,   lParam);  
   
  }  
   
     
   
  /********************************************************************/  
   
  /*   开始屏蔽键盘按键                                                                                                   */  
   
  /*                                                                                                                                     */  
   
  /*   参数:                                                                                                                         */  
   
  /*                         lpdwVirtualKey                   Keycode   数组的指针                           */  
   
  /*                         nLength                                 Keycode   数组的大小                           */  
   
  /*                         bDisableKeyboard               是否屏蔽整个键盘                               */  
   
  /*                                                                                                                                     */  
   
  /*   返回值:         TRUE   成功,   FALSE   失败                                                                   */  
   
  /********************************************************************/  
   
  BOOL   WINAPI   StartMaskKey(LPDWORD   lpdwVirtualKey,   int   nLength,   BOOL   bDisableKeyboard   =   FALSE)  
   
  {  
   
            //   如果已经安装键盘钩子则返回   FALSE  
   
            if   (g_hHook   !=   NULL)   return   FALSE;  
   
             
   
            //   将用户传来的   keycode   数组保存在全局变量中  
   
            g_lpdwVirtualKey   =   (LPDWORD)malloc(sizeof(DWORD)   *   nLength);  
   
            LPDWORD   tmpVirtualKey   =   g_lpdwVirtualKey;  
   
            for   (int   i   =   0;   i   <   nLength;   i++)  
   
            {  
   
                    *tmpVirtualKey++   =   *lpdwVirtualKey++;  
   
            }  
   
            g_nLength   =   nLength;  
   
            g_bDisableKeyboard   =   bDisableKeyboard;  
   
             
   
            //   安装底层键盘钩子  
   
            g_hHook   =   SetWindowsHookEx(WH_KEYBOARD_LL,   LowLevelKeyboardProc,   g_hInstance,   NULL);  
   
            if   (g_hHook   ==   NULL)   return   FALSE;  
   
            return   TRUE;  
   
             
   
  }  
   
     
   
  /********************************************************************/  
   
  /*   停止屏蔽键盘按键                                                                                                   */  
   
  /*                                                                                                                                     */  
   
  /*   参数:   (无)                                                                                                               */  
   
  /*                                                                                                                                     */  
   
  /*   返回值:         TRUE   成功,   FALSE   失败                                                                   */  
   
  /********************************************************************/  
   
  BOOL   WINAPI   StopMaskKey()  
   
  {  
   
            //   卸载钩子  
   
            if   (UnhookWindowsHookEx(g_hHook)   ==   0)   return   FALSE;  
   
            g_hHook   =   NULL;  
   
            return   TRUE;  
   
  }  
  Top

3 楼kernet(人生若只如初见,何事秋风悲画扇)回复于 2005-11-12 12:31:47 得分 0

//lock.h  
  DECLSPEC_IMPORT  
   
  BOOL  
   
  WINAPI  
   
  StartMaskKey(  
   
            LPDWORD   lpdwVirtualKey,  
   
            int   nLength,  
   
            BOOL   bDisableKeyboard   =   FALSE  
   
            );  
   
     
   
  DECLSPEC_IMPORT  
   
  BOOL  
   
  WINAPI  
   
  StopMaskKey();  
  //lock.def  
  EXPORTS  
   
  StartMaskKey     @1  
   
  StopMaskKey                 @2  
   
  Top

4 楼kernet(人生若只如初见,何事秋风悲画扇)回复于 2005-11-12 13:54:04 得分 20

将鼠标锁定在窗体范围内  
  CRect   rct;  
  GetWindowRect(rct);  
  ClipCursor(rct);Top

相关问题

  • 在NT/win2000下如何锁住键盘鼠标?急!
  • 求键盘模拟鼠标功能的VC源代码
  • 锁住鼠标到底怎么锁啊??
  • 锁定键盘和鼠标
  • 如何完全锁住键盘?
  • Java中可以锁住键盘吗??
  • UltraEdit中 键盘被锁住了
  • ~~请问,如何锁住键盘???~~
  • 您好! 请问如何锁住键盘??
  • 如何锁住电脑键盘

关键词

  • 键盘
  • 屏蔽
  • dll
  • null
  • lpdwvirtualkey
  • 钩子
  • bdisablekeyboard
  • hhook
  • 句柄
  • lpdword

得分解答快速导航

  • 帖主:donghongtao
  • kernet

相关链接

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

广告也精彩

反馈

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