如何永久终止Windows资源pipe理器(“explorer.exe”进程)?

我正在使用以下代码来终止进程:

function KillTask(ExeFileName: string): Integer; const PROCESS_TERMINATE = $0001; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin Result := 0; FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while Integer(ContinueLoop) <> 0 do begin if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then Result := Integer(TerminateProcess( OpenProcess(PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0)); ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end; 

问题是,当我调用上述函数来永久终止explorer.exeWindows资源pipe理器终止,但是之后重新启动:

 KillTask('explorer.exe'); 

我使用Delphi XE3,Delphi 7和Windows 8。

基于这个Exit Explorer功能和卢克在this post调试的代码,您可以尝试使用以下代码:

警告:

这种方式绝对没有记录! 所以在这篇文章中出现的所有常量和变量都是虚构的。 与真实的,有文件的代码的任何相似是纯粹的巧合:-)

 function ExitExplorer: Boolean; var TrayHandle: HWND; const WM_EXITEXPLORER = $5B4; begin Result := False; TrayHandle := FindWindow('Shell_TrayWnd', nil); if TrayHandle <> 0 then Result := PostMessage(TrayHandle, WM_EXITEXPLORER, 0, 0); end; 

我已经在Windows 7中进行了测试,它在哪里工作,甚至不需要管理员提升。 不知道其他系统如何(我说这至少在Windows XP上是行不通的,但这只是一个猜测)。