QtApplets-MyHook

359 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

头图

QtApplets-MyHook

今天要演技的是在Qt下是使用Hook 钩子函数,主要就是项目需要在win平台下实现,需要屏蔽掉一些键盘组合按键,以防止用户杀死程序。


QtApplets-MyHook1 新增注册表条目2 键盘钩子过程3 鼠标钩子过程4 安装钩子测试☞ 源码

关键字: 屏蔽键盘鼠标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);
    }
}

测试

这个需要在虚拟机下测试,程序需要以管理员运行。

image-20220223103329210

这是没有开启的状态

image-20220223103407051

image-20220223103608566

开启以后:

image-20220223103707364

开启任务栏快捷键也做了屏蔽。没法展示,下载源码自己体验吧。

☞ 源码

源码链接:GitHub仓库自取

使用方法:☟☟☟