WindowsAPI之SetWindowsHookEx()

来源:互联网 发布:.market域名 编辑:程序博客网 时间:2024/06/07 07:04

钩子函数可以用来获取系统的按键消息,进而可以屏蔽某些按键或者按键组合。我们发现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;    }}
0 0