QtApplets-MyHook

Posted DreamLife.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QtApplets-MyHook相关的知识,希望对你有一定的参考价值。

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仓库自取

使用方法:☟☟☟


以上是关于QtApplets-MyHook的主要内容,如果未能解决你的问题,请参考以下文章

《我不是药神》票房超25亿 曝片段呈现群像式演技

人生如戏,请给我好一点儿的演技

英伟达让AI“演技”再上台阶:仅靠语音驱动1张照片说话,惊讶恐惧表情狠狠拿捏...

瞬变电磁法的基本原理与TEM正演技术

新喜剧之王

导师的人选