CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

<---------键盘挂钩问题讨论----------->

楼主SmileAndHappy(快乐男孩)2004-04-04 11:59:42 在 VC/MFC / 进程/线程/DLL 提问

以下是我写的一个禁止键盘的dll。问题是该挂钩只能对一般的键起作用。而对  
  left   windows(窗口键,按键后出现开始菜单)不起作用。这是为什么?  
  小弟打魔兽时想按alt却老是按倒left   windows郁闷,想把它禁掉。  
  请高手指教  
   
  #include   "windows.h"  
   
  #pragma   data_seg("mydata")  
  HHOOK   hhkHook   =   NULL;   //定义钩子句柄  
  HINSTANCE   hInstance   =   NULL;   //dll的实例句柄  
  HWND   hWndMain   =   NULL;   //主窗口句柄  
  #pragma   data_seg()  
   
  LRESULT   CALLBACK   HookProc(int   nCode,WPARAM   wParam,LPARAM   lParam);  
   
  BOOL   APIENTRY   DllMain(HANDLE   hModule,DWORD   ul_reason_for_call,LPVOID   lpReserved)   {  
  switch   (ul_reason_for_call)   {  
  case   DLL_PROCESS_ATTACH:  
  break;  
  case   DLL_THREAD_ATTACH:  
  case   DLL_THREAD_DETACH:  
  case   DLL_PROCESS_DETACH:  
  break;  
  }  
  hInstance=(HINSTANCE)hModule;   //得到DLL实例  
  return   TRUE;  
  }  
   
  BOOL   WINAPI   enableHook(HWND   hWnd)   {  
  hWndMain   =   hWnd;  
  hhkHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)HookProc,hInstance,0);  
  return   true;  
  }  
   
  BOOL   WINAPI   disableHook()   {  
  return   UnhookWindowsHookEx(hhkHook);  
  }  
   
  LRESULT   CALLBACK   HookProc(int   nCode,WPARAM   wParam,LPARAM   lParam)   {  
  return   1;//没有传递消息下去。  
  }  
  问题点数:0、回复次数:24Top

1 楼rivershan(阿门)回复于 2004-04-04 14:35:57 得分 0

比较特殊吧,不清楚Top

2 楼SmileAndHappy(快乐男孩)回复于 2004-04-05 18:31:24 得分 0

不给分就没人来吗?Top

3 楼Lostinet(Hello)回复于 2004-04-07 10:58:50 得分 0

这个是有希望的。VirtualPC不就是钩了嘛。  
  Top

4 楼wlzqi(wlzqi)回复于 2004-04-07 18:04:08 得分 0

哈哈Top

5 楼_foo(莫依[双双朵朵])回复于 2004-04-07 18:19:13 得分 0

试试WH_KEYBOARD_LL   HookTop

6 楼xstring(麻雀)回复于 2004-04-07 20:38:05 得分 0

看看以下这段程序  
  只要它运行着,就可以满足你的要求  
  /*  
      kbhook.cpp  
  */  
   
  #define   _WIN32_WINNT         0x400  
  #define   STRICT  
  #define   WIN32_LEAN_AND_MEAN  
  #include   <stdio.h>  
  #include   <stdlib.h>  
  #include   <windows.h>  
   
  DWORD       g_main_tid     =   0;  
  HHOOK       g_kb_hook       =   0;  
  BOOL   CALLBACK   con_handler   (DWORD)  
          {  
                  PostThreadMessage   (g_main_tid,   WM_QUIT,   0,   0);  
                  return   TRUE;  
          };  
  LRESULT   CALLBACK   kb_proc   (int   code,   WPARAM   w,   LPARAM   l)  
          {  
                  PKBDLLHOOKSTRUCT   p   =   (PKBDLLHOOKSTRUCT)l;  
                  const   char   *info   =   NULL;  
                  if   (p->vkCode   ==   VK_LWIN)  
                          return   1;  
                  //     always   call   next   hook  
                  return   CallNextHookEx   (g_kb_hook,   code,   w,   l);  
          };  
   
  int   main   (void)  
          {  
                  g_main_tid   =   GetCurrentThreadId   ();  
                  SetConsoleCtrlHandler   (&con_handler,   TRUE);  
   
                  g_kb_hook   =   SetWindowsHookEx   (  
                          WH_KEYBOARD_LL,    
                          &kb_proc,    
                          GetModuleHandle   (NULL),   // 不能为NULL,否则失败  
                          0);  
   
                  if   (g_kb_hook   ==   NULL)  
                  {  
                          fprintf   (stderr,    
                                  "SetWindowsHookEx   failed   with   error   %d\n",  
                                  ::GetLastError   ());  
                          return   0;  
                  };  
   
                  //     消息循环是必须的,想知道原因可以查msdn  
   
                  MSG   msg;  
                  while   (GetMessage   (&msg,   NULL,   0,   0))  
                  {  
                          TranslateMessage   (&msg);  
                          DispatchMessage   (&msg);  
                  };  
                  UnhookWindowsHookEx   (g_kb_hook);  
                  return   0;  
          };  
  Top

7 楼kugou123(酷狗)(彪悍的人生,不需要解释 www.xiaozhou.net)回复于 2004-04-08 21:15:40 得分 0

是不是WIN键只能用低级键盘钩子才能钩上啊?用普通的键盘钩子怎么不行?我试过用普通的键盘钩子对左边的WIN键挂钩,结果不成功。Top

8 楼lmfweng(心飞)回复于 2004-04-09 16:59:31 得分 0

我觉得这样做了,还是不能对ALT+CTRL+DEL使它挂起。Top

9 楼kuangjingbo(正在学习windows)回复于 2004-04-09 22:19:17 得分 0

WH_KEYBOARD  
  不可以钩系统键Top

10 楼kugou123(酷狗)(彪悍的人生,不需要解释 www.xiaozhou.net)回复于 2004-04-09 22:28:46 得分 0

那应该怎样实现啊?关注……Top

11 楼kuangjingbo(正在学习windows)回复于 2004-04-09 22:30:04 得分 0

我查资料是这么说的   :  
  WH_KEYBOARD:当应用程序调用函数GetMessage或者PeekMessage并且出现键盘事件WM_KEYUP或者WM_KEYDOWN需要处理时,windows就调用WH_KEYBOARD的过滤函数。  
   
  看见了吗?只处理WM_KEYUP或者WM_KEYDOWN而不处理WM_SYSKEYDOWN或者WM_SYSKEYUP,那么你的alt是系统键的功能键只能接收到WM_SYSKEYDOWN和WM_SYSKEYUP,你可以用spy++试试看!!  
   
  所以我上面那么说Top

12 楼kuangjingbo(正在学习windows)回复于 2004-04-09 22:37:40 得分 0

可以用WH_GETMESSAGE钩子,然后判断消息的内容:  
  switch(wParam)  
  {  
            case(WM_KEYDOWN):     ...     break;  
            case(WM_KEYUP):     ...     break;  
            case(WM_SYSKEYDOWN):     ...     break;  
            case(WM_SYSKEYDUP):     ...     break;  
            case(WM_CHAR):     ...     break;  
            case(WM_SYSCHAR):...     break;  
  ......  
            default:     ...   ;  
  }  
   
  内容自己根据要求填写吧!  
             
  Top

13 楼kugou123(酷狗)(彪悍的人生,不需要解释 www.xiaozhou.net)回复于 2004-04-14 10:35:13 得分 0

我试试看。Top

14 楼kugou123(酷狗)(彪悍的人生,不需要解释 www.xiaozhou.net)回复于 2004-04-16 10:47:58 得分 0

我查过MSDN,在WH_KEYBOARD_LL的说明中表示,该键盘低级钩子是可以钩住系统键的,一般的WH_KEYBOARD钩子则不行。Top

15 楼zhi_liu6(野战炮)回复于 2004-04-16 22:11:44 得分 0

要钩ctrl   +   alt   +   del只能打driver的主意Top

16 楼yafizyh(亚斐)回复于 2004-04-18 01:10:40 得分 0

键盘系统键可以被发现,但是按键引发的作用在键盘消息进入应用程序的消息队列前已经被处理了,所以禁止系统键靠钩子是不行的。Top

17 楼yifengling0(逸枫)回复于 2004-04-19 10:26:08 得分 0

WH_KEYBOARD_LL    
   
  这个可以钩到的。~~  
   
  以前写过一个把。。win键改成。esc键的程序。  
   
  在vc知识库有一个钩ctl+alt+del的程序。。看看那个  
  Top

18 楼ahao(天·狼·星星)回复于 2004-04-19 19:50:19 得分 0

那个不是用钩子,用的是gina.dllTop

19 楼lmfweng(心飞)回复于 2004-04-20 09:54:56 得分 0

那个我去看了一下,有些程序那上面要动态调用msgina.dll,但实际上不能调用,如它不调用那个文件,可以吗,如果要调用它,但因为它没有.lib导入文件。所以我觉得不能如那个vc学习的11章那上面所谈的那样,可以动态调用msgina.dll,请问这些问题可以如何解决。在线等。Top

20 楼ahao(天·狼·星星)回复于 2004-04-20 10:09:36 得分 0

你说的什么呀?Top

21 楼nf3()回复于 2004-04-26 23:07:36 得分 0

upTop

22 楼angelcool(快乐需要创造)回复于 2004-05-03 17:29:47 得分 0

mark  
  Top

23 楼lflch(巴格)回复于 2004-05-03 21:22:35 得分 0

mark  
  Top

24 楼lg13579(lg)回复于 2004-05-07 13:22:11 得分 0

hi!我想问你个问题,  
  我在windowsxp+vc6.0下写钩子函数,  
  hHook=SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)HookProc,hInstance1,0);  
  错误如下:  
  F:\MyProjects\testkeyboardDLL3\testkeyboardDLL3.cpp(75)   :   error   C2065:   'WH_KEYBOARD_LL'   :   undeclared   identifier  
  我在头文件上加了:  
  #define   WIN32_LEAN_AND_MEAN  
  请问为什么?如果改成WH_KEYBOARD则完全没有问题。是不是系统不能识别WH_KEYBOARD_LL低级钩子?  
  ludayi2003@yahoo.com.cnTop

相关问题

  • 键盘挂钩问题
  • 关于键盘挂钩问题
  • 如何用挂钩截获系统的键盘事件
  • 讨论一下:如何做一个好的键盘记录器!
  • 一个全局键盘钩子的源代码,请进来讨论一下。
  • 挂钩?
  • 电脑 主板上的 键盘鼠标 接口全坏了,我该咋办?讨论有分
  • 如何模拟键盘输入。。模拟过程中的一些问题。。有实践的朋友,讨论一下。
  • 讨论:操作一般的软件,用鼠标方便还是用键盘方便?
  • 讨论:如何判断在规定的时间内,用户无动作(没有鼠标键盘等)

关键词

  • win32
  • 键盘
  • 函数
  • 系统
  • 消息
  • 钩子
  • wh
  • keyboard
  • 调用
  • 键

得分解答快速导航

  • 帖主:SmileAndHappy

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

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