1. 程式人生 > >c++屏蔽Win10系統快捷鍵

c++屏蔽Win10系統快捷鍵

tro strcmp win10 sentry success echart getc 如果 dsn

很久之前實現的功能,也是參考其他人的實現,時間太久,具體參考哪裏已經記不得了。

這裏不僅能屏蔽一般的快捷鍵,還可以屏蔽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();

c++屏蔽Win10系統快捷鍵