BOOL DisableCTRL_ALT_DEL(bool bDisable)
{
if (bDisable==suspend)
return FALSE;
//bDisable ? Suspend(_WinLoginPid) : Resume(_WinLoginPid);
typedef DWORD(WINAPI* NtProcessAPI)(HANDLE ProcessHandle);
HMODULE h_module = LoadLibrary(L"ntdll.dll");
if (!h_module)
return FALSE;
NtProcessAPI _NtResumeProcess = (NtProcessAPI)GetProcAddress(h_module, bDisable ? "NtSuspendProcess" : "NtResumeProcess");
if (_NtResumeProcess)
{
HANDLE ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, _WinLoginPid);
if (ProcessHandle)
{
_NtResumeProcess(ProcessHandle);
CloseHandle(ProcessHandle);
}
}
suspend = bDisable;
FreeLibrary(h_module);
return TRUE;
}
说明:bDisable为一成员变量记录自己是否已经禁用。
_WinLoginPid为下列函数返回值。
DWORD GetWinLoginPID()
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
DWORD PID = 0;
BOOL bNext = ::Process32First(hProcessSnap, &pe32);
while (bNext)
{
if (wcscmp(pe32.szExeFile, L"winlogon.exe") == 0)
{
PID = pe32.th32ProcessID;
break;
}
bNext = ::Process32Next(hProcessSnap, &pe32);
}
::CloseHandle(hProcessSnap);
return PID;
}
此方法缺陷:
1、因为挂起了winlogon,这是系统关键进程,会对系统功能有影响,所以退出程序一定要恢复它。
2、退出程序后组合键仍然会被处理。
另一个方法是注入winlogon自己接管消息处理,这个风险会更大,容易使用系统出现问题。如果有大量测试机可以试试。