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

相关文章推荐

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

Java原生API并不支持为应用程序设置全局热键。要实现全局热键,需要用JNI方式实现,这就涉及到编写C/C++代码,这对于大多数不熟悉C/C++的javaer来说,有点困难。不过幸好,国外有人已经实...

程序员修炼之路(六)编写自己的工具(JAVA注册系统级快捷键源码>jintellitype<)

这俩天在公司抽空写了一个JAVA的小工具。因为现在在公司做的是测试任务,所以经常用到“ALT+PrtScn”(截图)和“CTRL+V”(粘贴)这两个组合快捷键。 因为这俩个组合键实在是远了,一个手不...

VC++实现监视系统的键盘操作(2) 创建记录键盘动作的全局钩子DLL

全局钩子函数必须以DLL(动态连接库)为载体进行封装,VC++6.0中有三种形式的MFC DLL可供选择,即 Regular DLL with MFC statically linked(标准静态链...

用钩子hook捕获组合键消息实现MFC程序的显示/隐藏

目前开发的项目和MES类似,但功能超过了MES,客户的一些设备的运行数据采集是通过一个工控机上MFC程序实现的,可以采集ACCESS、SQL Server 2000数据库表中数据条目,机器数据都是1分...

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

win7,win8系统与winxp系统不一样,ctrl+alt+delete热键会打开一个安全界面,而不仅仅是打开任务管理系统,而安全界面是由进程winlogon.exe来控件的,就是说,在按下热键的...

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

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

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

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

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

VC添加全局热键的方法

全局热键定义 VirtualKey.h /************************************************************************/ // Vi...

windows 编程 注册热键

网上找了很多关于注册热键的,都是基于MFC 响应的。 本文是 直接响应 对于注册多个热键,使用hotkeyid ,我这里是使用 对于 输入的按键,进行拼接,将保证每次键入的id 都不同,方...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++/MFC——一个能截获和屏蔽系统热键的钩子
举报原因:
原因补充:

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