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();
  • 相关阅读:
    BZOJ 3205 [Apio2013]机器人 ——斯坦纳树
    BZOJ 3782 上学路线 ——动态规划 Lucas定理 中国剩余定理
    HDU 1423 Greatest Common Increasing Subsequence ——动态规划
    BZOJ 3309 DZY Loves Math ——莫比乌斯反演
    POJ 1038 Bugs Integrated, Inc. ——状压DP
    POJ 3693 Maximum repetition substring ——后缀数组
    POJ 2699 The Maximum Number of Strong Kings ——网络流
    POJ 2396 Budget ——有上下界的网络流
    BZOJ 4650 [Noi2016]优秀的拆分 ——后缀数组
    源码安装python
  • 原文地址:https://www.cnblogs.com/tiandsp/p/10275683.html
Copyright © 2011-2022 走看看