码迷,mamicode.com
首页 > Windows程序 > 详细

SetWindowsHookEx()

时间:2015-08-13 18:06:14      阅读:525      评论:0      收藏:0      [点我收藏+]

标签:c++

钩子函数可以用来获取系统的按键消息,进而可以屏蔽某些按键或者按键组合。我们发现WH_KEYBORAD_LL和WH_MOUSE_LL这两个low-level的hook可以被安装成全局的,这我们不妨用这两个low-level的hook替换掉WH_KEYBORAD和WH_MOUSE。
1 首先在xxDlg.h中添加如下代码

#if (_WIN32_WINNT >= 0x0400)
#define WH_KEYBOARD_LL     13
#define WH_MOUSE_LL        14
#define LLKHF_ALTDOWN (KF_ALTDOWN >> 8)  
#endif // (_WIN32_WINNT >= 0x0400)

typedef struct {
    DWORD vkCode;
    DWORD scanCode;
    DWORD flags;
    DWORD time;
    DWORD dwExtraInfo;
} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;

不添加这些代码的话,那么编译器会显示有些变量是没有被定义的
2 然后添加键盘按键处理函数,它是一个回调函数

LRESULT CALLBACK LowLevelKeyboardProc (INT nCode, WPARAM wParam, LPARAM lParam)
{
    // By returning a non-zero value from the hook procedure, the
    // message does not get passed to the target window
   KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *)lParam;
    BOOL bControlKeyDown = 0;
    switch (nCode)
    {
    case HC_ACTION:
        {
            // Check to see if the CTRL key is pressed
            bControlKeyDown = GetAsyncKeyState (VK_CONTROL) >> ((sizeof(SHORT) * 8) - 1);//获取指定按键的状态
            //Disable CTRL+ESC
            //if (bControlKeyDown)
        //  {
            //  AfxMessageBox("control按下");
            //}
            if (pkbhs->vkCode == VK_ESCAPE && bControlKeyDown)
                return 1;

            //Disable ALT+TAB
            if (pkbhs->vkCode == VK_TAB && pkbhs->flags & LLKHF_ALTDOWN)
                return 1;

            //Disable ALT+ESC
            if (pkbhs->vkCode == VK_ESCAPE && pkbhs->flags & LLKHF_ALTDOWN)
                return 1;

            break;
        }
    default:
        break;
    }
    return 1;
}

我们要知道pkbhs->vkCode指定的是键盘按键的虚拟键码,而LOBYTE(pkbhs->vkCode)指定的是键盘按键的ascii码

3添加全局键盘钩子函数 一般在OnCreate()函数中添加

int CHOOKEXDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (CDialog::OnCreate(lpCreateStruct) == -1)
        return -1;

    // TODO: Add your specialized creation code here
     Hook =(HHOOK)SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)LowLevelKeyboardProc,AfxGetApp()->m_hInstance,0); 
    return 0;
}

4添加卸载钩子函数,一般在OnDestory()函数中添加

void CHOOKEXDlg::OnDestroy() 
{
    CDialog::OnDestroy();

    // TODO: Add your message handler code here
    if(Hook)
    {
        BOOL result = UnhookWindowsHookEx((HHOOK)Hook); // 卸载钩子
        if (result) Hook = NULL;
    }
}


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

SetWindowsHookEx()

标签:c++

原文地址:http://blog.csdn.net/cxq_1993/article/details/47615519

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!