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

 
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 有介绍。

你可能感兴趣的:(C++,struct,null,action,hook,keyboard)