c++屏蔽Win10系统快捷键
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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";
return1;
}
else if (pkbhs->vkCode == VK_ESCAPE && GetAsyncKeyState(VK_CONTROL) & 0x8000){
qDebug() << "Ctrl+Esc";
return1;
}
else if (pkbhs->vkCode == VK_TAB && pkbhs->flags & LLKHF_ALTDOWN){
qDebug() << "Alt+Tab";
return1;
}
else if (pkbhs->vkCode == VK_ESCAPE && pkbhs->flags &LLKHF_ALTDOWN){
qDebug() << "Alt+Esc";
return1;
}
else if (pkbhs->vkCode == VK_LWIN || pkbhs->vkCode == VK_RWIN){
qDebug() << "LWIN/RWIN";
return1;
}
else if (pkbhs->vkCode == VK_F4 && pkbhs->flags & LLKHF_ALTDOWN){
qDebug() << "Alt+F4";
return1;
}
//return 1;//返回1表⽰截取消息不再传递,返回0表⽰不作处理,消息继续传递
//}
return CallNextHookEx(keyHook, nCode, wParam, lParam);
}
//⿏标钩⼦过程
LRESULT CALLBACK mouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
return1;
}
//卸载钩⼦
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();。