C++/MFC——一个能截获和屏蔽系统热键的钩子

原创 2007年09月18日 16:15:00
 
BOOL installhook()
{
    HINSTANCE hins
=AfxGetInstanceHandle();
    HHOOK Hook 
= SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)KeyboardProc,hins,0); 
    
return (BOOL)Hook;
}

第一句是获得当前应用实例的句柄。
第二句是创建钩子,第一个参数WH_KEYBOARD_LL说明这是一个“low-level keyboard Hook”,可以截获系统热键的消息。最后一个参数0指定钩子截获所有进程的消息,也就是一个全局钩子。

LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)

    BOOL Discard 
= FALSE;
    
    
if (nCode == HC_ACTION)
    
{
        
switch (wParam)
        
{
        
case WM_KEYDOWN:  case WM_SYSKEYDOWN:
        
case WM_KEYUP:    case WM_SYSKEYUP: 
            PKBDLLHOOKSTRUCT p 
= (PKBDLLHOOKSTRUCT) lParam;
            Discard
= 
                
//Tab + Alt
                ((p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN) != 0))
                
//Esc + Alt
                || ((p->vkCode == VK_ESCAPE) && ((p->flags & LLKHF_ALTDOWN) != 0))
                
//Esc + Ctrl
                || ((p->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 0x8000!= 0))
                
//Ctrl + Space
                || (((GetKeyState(VK_CONTROL) & 0x8000!= 0&& (p->vkCode == VK_SPACE));
            
break;
        }

    }

    
return(Discard? 1 : CallNextHookEx(NULL, nCode, wParam, lParam));
}

PKBDLLHOOKSTRUCT p是WH_KEYBOARD_LL钩子回调函数所使用的结构体。MSDN中的结构说明和定义如下:

typedef struct tagKBDLLHOOKSTRUCT {
    DWORD vkCode;      
// virtual key code
    DWORD scanCode;    // scan code
    DWORD flags;       // flags
    DWORD time;        // time stamp for this message
    DWORD dwExtraInfo; // extra info from the driver or keybd_event
}
 KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;

上面的例子,如果Discard后面的条件为真,那么return(Discard ? 1 : CallNextHookEx(NULL, nCode, wParam, lParam));这句将会屏蔽该次按键操作。

其中LLKHF_ALTDOWN代表 Alt 键按下。
((GetKeyState(VK_CONTROL) & 0x8000) != 0)用来测试Ctrl被按下

注:这个方法对Alt+Ctrl+Del无效。要屏蔽这个热键需要较为复杂的方法http://www.vckbase.com/document/viewdoc/?id=242 有介绍。

钩子编程(HOOK) 屏蔽所有按键、鼠标及系统功能键 (4)

[钩子编程(HOOK) 屏蔽所有按键鼠标及系统功能键]上篇文章《钩子编程(HOOK) 安装系统全局钩子》已经详细的讲解了全局钩子的安装,下面我们增强一下钩子的功能,实现屏蔽所有按键鼠标与系统功能键。要...
  • u012339743
  • u012339743
  • 2014年05月15日 13:32
  • 4174

C#编写的屏蔽系统热键的实例,涉及到钩子

  • 2010年12月20日 11:24
  • 29KB
  • 下载

C++程序屏蔽常规按键(ctrl+alt+delete除外)

C++屏蔽键盘按键其实就是用钩子,只是让按键不起反应还是很简单的 1、首先设置钩子 HHOOK keyHook = NULL; void setHook() { keyHook =Set...
  • rongyong
  • rongyong
  • 2015年09月02日 15:35
  • 1216

C++的全局键盘HOOK屏蔽Win键

/************************************************** ** Project:DisabeldWinKeys ** File:Main.cp...
  • PeterZhuGe
  • PeterZhuGe
  • 2015年05月22日 10:07
  • 2344

C++程序屏蔽windows2008系统安全界面(ctrl+alt+delete热键)

win7,win8系统与winxp系统不一样,ctrl+alt+delete热键会打开一个安全界面,而不仅仅是打开任务管理系统,而安全界面是由进程winlogon.exe来控件的,就是说,在按下热键的...
  • rongyong
  • rongyong
  • 2015年09月02日 15:25
  • 1155

vc++键盘钩子和鼠标钩子

该例的钩子都是写在一个DLL中的,和应用程序独立开来的全局钩子。 一般情况下,如果要截获鼠标和普通按键,刚可以用下边的方法 鼠标: LRESULT CALLBACK MouseProc(   ...
  • wjn1206
  • wjn1206
  • 2012年12月06日 09:53
  • 6415

VC++实现全局钩子勾住消息对话框

#ifndef _HOOKAPI_H #define _HOOKAPI_H class CHOOKAPI { public: LPVOID pOldFunEntry, pNewFun...
  • yincheng01
  • yincheng01
  • 2012年10月09日 20:19
  • 3088

C++完美版钩子的使用实例

  • 2012年11月10日 13:26
  • 335KB
  • 下载

C++钩子技术窃取IE数据

先生成dll ktr.h代码: #ifndef KTR_H #define KTR_H #include extern "C" void __declspec(dllexport) SetKb...
  • feier7501
  • feier7501
  • 2013年07月23日 21:54
  • 1291

VC++实现全局钩子勾住textout金山快译的原理实现

大家都对金山快译可以讲英文软件翻译成中文软件感到惊奇其实就是全局钩子勾住textout函数钩子头文件如下void __declspec(dllexport) WINAPI InstallHook(BO...
  • yincheng01
  • yincheng01
  • 2012年10月09日 20:23
  • 5378
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++/MFC——一个能截获和屏蔽系统热键的钩子
举报原因:
原因补充:

(最多只允许输入30个字)