标签: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;
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:c++
原文地址:http://blog.csdn.net/cxq_1993/article/details/47615519