本文已参与「新人创作礼」活动,一起开启掘金创作之路。
QtApplets-MyHook
今天要演技的是在Qt下是使用Hook 钩子函数,主要就是项目需要在win平台下实现,需要屏蔽掉一些键盘组合按键,以防止用户杀死程序。
关键字:
屏蔽、键盘、鼠标、HOOK、钩子
1 新增注册表条目
这个是为了屏蔽Ctrl + Alt + Delete用的
/**
* 新增注册表内容
*/
#define TASKMANAGERSystem "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System"
#define TASKMANAGERExplorer "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer"
2 键盘钩子过程
/**
* @brief keyProc
* @param nCode
* @param wParam
* @param lParam
* @return
* 键盘钩子过程
*/
LRESULT CALLBACK keyProc(int nCode,WPARAM wParam,LPARAM lParam )
{
//在WH_KEYBOARD_LL模式下lParam 是指向KBDLLHOOKSTRUCT类型地址
KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;
//如果nCode等于HC_ACTION则处理该消息,如果小于0,则钩子子程就必须将该消息传递给 CallNextHookEx
if(nCode == HC_ACTION)
{
if(pkbhs->vkCode == VK_ESCAPE && GetAsyncKeyState(VK_CONTROL)& 0x8000 && GetAsyncKeyState(VK_SHIFT)&0x8000) //屏蔽 "Ctrl+Shift+Esc"
return 1;
if(pkbhs->vkCode == VK_ESCAPE && GetAsyncKeyState(VK_CONTROL) & 0x8000) //屏蔽 "Ctrl+Esc"
return 1;
if(pkbhs->vkCode == VK_TAB && pkbhs->flags & LLKHF_ALTDOWN) //屏蔽 "Alt+Tab"
return 1;
if(pkbhs->vkCode == VK_ESCAPE && pkbhs->flags &LLKHF_ALTDOWN) //屏蔽 "Alt+Esc"
return 1;
if(pkbhs->vkCode == VK_LWIN || pkbhs->vkCode == VK_RWIN) //屏蔽 "LWIN/RWIN"
return 1;
if(pkbhs->vkCode == VK_F4 && pkbhs->flags & LLKHF_ALTDOWN) //屏蔽 "Alt+F4"
return 1;
}
return CallNextHookEx(mKeyHook, nCode, wParam, lParam);
}
3 鼠标钩子过程
/**
* @brief mouseProc
* @param nCode
* @param wParam
* @param lParam
* @return
* 鼠标钩子过程
*/
LRESULT CALLBACK mouseProc(int nCode,WPARAM wParam,LPARAM lParam )
{
Q_UNUSED(nCode);
Q_UNUSED(wParam);
Q_UNUSED(lParam);
return 1;
}
4 安装钩子
/**
* @brief MyHook::hook
* @param flag
* 安装钩子
*/
void MyHook::hook(bool flag)
{
if (flag)
{
//这两个底层钩子,不要DLL就可以全局
//底层键盘钩子
mKeyHook =SetWindowsHookEx( WH_KEYBOARD_LL,keyProc,GetModuleHandle(NULL),0);
//底层鼠标钩子
// mMouseHook =SetWindowsHookEx( WH_MOUSE_LL,mouseProc,GetModuleHandle(NULL),0);
}
else
{
UnhookWindowsHookEx(mKeyHook);
// UnhookWindowsHookEx(mMouseHook);
}
}
测试
这个需要在虚拟机下测试,程序需要以管理员运行。
这是没有开启的状态

开启以后:
开启任务栏快捷键也做了屏蔽。没法展示,下载源码自己体验吧。
☞ 源码
源码链接:GitHub仓库自取
使用方法:☟☟☟