我以介绍如何屏蔽PrtSc(PrintScreen)截屏键为例,标题中说的低级键盘钩子(WH_KEYBOARD_LL)是因为普通键盘钩子(WH_KEYBOARD)是无法过滤像截屏键这样的系统按键,屏蔽系统按键回了其余的自然不在话下。
在低级键盘钩子函数里判断这个消息是否属于PrintScreen按键,如果是,就直接返回TRUE之前在介绍Windows钩子函数的时候说过,想屏蔽消息的话就直接返回一个TRUE,如果不是就调用CallNextHookEx()函数传递给钩子链的下一个。
大体的方法在另一篇博客中,看了这个就知道接下来怎么做了
LRESULT _stdcall LowLevelKeyBoardProc(int code, WPARAM wParam, LPARAM lParam)
{
KBDLLHOOKSTRUCT *Key_Info = (KBDLLHOOKSTRUCT*)lParam;
if (HC_ACTION == code)
{
if (WM_KEYDOWN == wParam || WM_SYSKEYDOWN == wParam)// ||WM_SYSKEYDOWN == wParam
{
if (Key_Info->vkCode == VK_SNAPSHOT) //如果是屏蔽键
{
//MessageBox(NULL,TEXT("PrtSc键被禁用"),NULL,MB_OK);
//不能再上边随便的加函数 如果加了函数 系统在这个函数执行的间隙就把需要屏蔽的键盘消息给截获了
return TRUE;
}
}
}
return CallNextHookEx(g_Hook,code,wParam,lParam);
}
VOID UnUsePrtSc()
{
//安装的是低级键盘钩子 WH_KEYBOARD_LL
g_Hook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)LowLevelKeyBoardProc, g_Instance, NULL);
}
如果要屏蔽其他键盘消息的话,在上边if(Key_Info->vkCode==VK_SNAPSHOT)
把VK_SNAPSHOT更换为VK_A、VK_B(键盘A消息、键盘B消息),更多的在MSDN搜索VK_开头的由更多的。
但是注意 再vs2015或者其他版本对VK_没有定义宏但是查看定义时候有写道:
所以VK_A等宏无效的时候,就直接令Key_Info->vkCode等于相应的十六进制就行了