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();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM