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

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

屏蔽系统热键的方法总结

在编写程序的过程中,我们有时需要实现屏蔽操作系统一些热键的功能,如(ctrl+delete+alt,ctrl+shift+esc等)。网络上有很多关于这方面的资料,总结了一下,一般有如下两个方法: ...

MFC实现全局热键

#define F10 0x00001

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Ring3下无驱动移除winlogon.exe进程ctrl+alt+del,win+u,win+l三个系统热键,非屏蔽热键

随手而作,纯粹技术研究,没什么实际意义。打开xuetr,正常情况下.winlogon.exe注册了三个热键。ctrl+alt+del,win+u,win+l三个。这三个键用SetWindowsHook...

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

/************************************************** ** Project:DisabeldWinKeys ** File:Main.cp...

MFC实现全局热键

要想使用全局热键的话,需要用到两个函数: BOOL WINAPI RegisterHotKey( __in_opt HWND hWnd, __in int id, __...

Java设置全局热键钩子——第三方包jintellitype实现

Java原生API并不支持为应用程序设置全局热键。要实现全局热键,需要用JNI方式实现,这就涉及到编写C/C++代码,这对于大多数不熟悉C/C++的javaer来说,有点困难。不过幸好,国外有人已经实...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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