zoukankan      html  css  js  c++  java
  • c++屏蔽Win10系统快捷键

    很久之前实现的功能,也是参考其他人的实现,时间太久,具体参考哪里已经记不得了。

    这里不仅能屏蔽一般的快捷键,还可以屏蔽ctrl+atl+del。

    int globlePid = 0;
    HHOOK keyHook = NULL;
    HHOOK mouseHook = NULL;
    
    //键盘钩子过程
    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){
            qDebug() << "Ctrl+Shift+Esc";
            return 1;
        }
        else if (pkbhs->vkCode == VK_ESCAPE && GetAsyncKeyState(VK_CONTROL) & 0x8000){
            qDebug() << "Ctrl+Esc";
            return 1;
        }
        else if (pkbhs->vkCode == VK_TAB && pkbhs->flags & LLKHF_ALTDOWN){
            qDebug() << "Alt+Tab";
            return 1;
        }
        else if (pkbhs->vkCode == VK_ESCAPE && pkbhs->flags &LLKHF_ALTDOWN){
            qDebug() << "Alt+Esc";
            return 1;
        }
        else if (pkbhs->vkCode == VK_LWIN || pkbhs->vkCode == VK_RWIN){
            qDebug() << "LWIN/RWIN";
            return 1;
        }
        else if (pkbhs->vkCode == VK_F4 && pkbhs->flags & LLKHF_ALTDOWN){
            qDebug() << "Alt+F4";
            return 1;
        }
    
        //return 1;//返回1表示截取消息不再传递,返回0表示不作处理,消息继续传递
        //}
        return CallNextHookEx(keyHook, nCode, wParam, lParam);
    }
    
    //鼠标钩子过程
    LRESULT CALLBACK mouseProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
        return 1;
    }
    
    //卸载钩子
    void unHook()
    {
        UnhookWindowsHookEx(keyHook);
        //  UnhookWindowsHookEx(mouseHook);
    }
    
    //安装钩子,调用该函数即安装钩子
    void setHook()
    {
        //这两个底层钩子,不要DLL就可以全局
        //底层键盘钩子
        keyHook = SetWindowsHookEx(WH_KEYBOARD_LL, keyProc, GetModuleHandle(NULL), 0);
        //底层鼠标钩子
        //    mouseHook =SetWindowsHookEx( WH_MOUSE_LL,mouseProc,GetModuleHandle(NULL),0);
    }
    
    //提升权限
    void EnableDebugPriv()
    {
        HANDLE hToken;
        LUID sedebugnameValue;
        TOKEN_PRIVILEGES tkp;
    
        if (!OpenProcessToken(GetCurrentProcess(),
            TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
            return;
        }
        if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue)) {
            CloseHandle(hToken);
            return;
        }
        tkp.PrivilegeCount = 1;
        tkp.Privileges[0].Luid = sedebugnameValue;
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL)) {
            CloseHandle(hToken);
            return;
        }
    }
    
    char* ConvertLPWSTRToLPSTR(LPWSTR lpwszStrIn)
    {
        LPSTR pszOut = NULL;
        if (lpwszStrIn != NULL)
        {
            int nInputStrLen = wcslen(lpwszStrIn);
    
            // Double NULL Termination  
            int nOutputStrLen = WideCharToMultiByte(CP_ACP, 0, lpwszStrIn, nInputStrLen, NULL, 0, 0, 0) + 2;
            pszOut = new char[nOutputStrLen];
    
            if (pszOut)
            {
                memset(pszOut, 0x00, nOutputStrLen);
                WideCharToMultiByte(CP_ACP, 0, lpwszStrIn, nInputStrLen, pszOut, nOutputStrLen, 0, 0);
            }
        }
        return pszOut;
    }
    
    //冻结
    void Freeze()
    {
        //枚举进程信息
        PROCESSENTRY32 pe32;
        pe32.dwSize = sizeof(pe32);
        HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    
        int processPid;
        //CString strTmp;
        BOOL b = ::Process32First(hProcessSnap, &pe32);
        while (b)
        {
            processPid = pe32.th32ProcessID;
            char *exeFile = ConvertLPWSTRToLPSTR(pe32.szExeFile);
            if (strcmp(exeFile, "winlogon.exe") == 0)
            {
                break;
            }
    
            delete[] exeFile;
    
            b = ::Process32Next(hProcessSnap, &pe32);
        }
        ::CloseHandle(hProcessSnap);
    
        THREADENTRY32 th32;
        th32.dwSize = sizeof(th32);
        HANDLE hThreadSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
        globlePid = processPid;
        unsigned long Pid;
        Pid = processPid;
        b = ::Thread32First(hThreadSnap, &th32);
        while (b)
        {
            if (th32.th32OwnerProcessID == Pid)
            {
                HANDLE oth = OpenThread(THREAD_ALL_ACCESS, FALSE, th32.th32ThreadID);
                if (!(::SuspendThread(oth)))
                {
                    qDebug() << "freeze successed";
                }
                else
                {
                    qDebug() << "freeze failed";
                }
                CloseHandle(oth);
                break;
            }
            ::Thread32Next(hThreadSnap, &th32);
        }
        ::CloseHandle(hThreadSnap);
    }
    
    void unFreeze()
    {
        unsigned long Pid;
        Pid = globlePid;
    
        THREADENTRY32 th32;
        th32.dwSize = sizeof(th32);
    
        HANDLE hThreadSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
        BOOL b = ::Thread32First(hThreadSnap, &th32);
        while (b)
        {
            if (th32.th32OwnerProcessID == Pid)
            {
                HANDLE oth = OpenThread(THREAD_ALL_ACCESS, FALSE, th32.th32ThreadID);
                if (::ResumeThread(oth))
                {
                    qDebug() << "unfreeze successed";
                }
                else
                {
                    qDebug() << "unfreeze failed";
                }
                CloseHandle(oth);
                break;
            }
            ::Thread32Next(hThreadSnap, &th32);
        }
        ::CloseHandle(hThreadSnap);
    }

    调用:

        //屏蔽ctrl+alt+del
      EnableDebugPriv();
      Freeze();
        //屏蔽其他快捷键
      
    setHook();
  • 相关阅读:
    Spring JDBC配置数据源
    Eclipse创建一个Maven Web项目
    部署基于Maven的war文件到Tomcat
    使用“mvn site-deploy”部署站点(WebDAV例子)
    生成基于Maven的项目文档站点
    将项目安装到Maven本地资源库
    使用Maven运行单元测试
    使用Maven清理项目
    使用Maven构建项目
    Dubbo的使用入门
  • 原文地址:https://www.cnblogs.com/tiandsp/p/10275683.html
Copyright © 2011-2022 走看看