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

如何永久终止Windows资源管理器(“Explorer.exe”进程)?,windows,delphi,winapi,Windows,Delphi,Winapi,我正在使用以下代码终止进程: function KillTask(ExeFileName: string): Integer; const PROCESS_TERMINATE = $0001; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin Result := 0; FSnapshotHandle := CreateToolhelp32Sna

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

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;
我正在使用Delphi XE3、Delphi 7和Windows 8。

基于此功能和Luke在中调试的代码,您可以尝试使用以下代码:

警告:

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

函数ExitExplorer:布尔型;
变量
TrayHandle:HWND;
常数
WM_EXITEXPLORER=5B4美元;
开始
结果:=假;
TrayHandle:=FindWindow('Shell_TrayWnd',无);
如果TrayHandle为0,则
结果:=消息后(TrayHandle,WM_EXITEXPLORER,0,0);
结束;

我已经在Windows7中测试了它,它可以工作,甚至不需要管理员提升。不知道其他系统如何(我想说这至少在Windows XP上不起作用,但这只是一个猜测)。

请注意,此代码泄漏了进程句柄。(终止一个进程并不会神奇地使它的所有句柄消失。)这是出于设计。系统确保您的shell运行。如果你想替换shell,那么你应该这样做。你能提供替代代码永久终止explorer进程吗。FWIW这不是Delphi的问题。这是一个Windows问题。用Delphi标记可能会吓跑一些Windows专家。explorer.exe进程是否真的终止了?@David,是的,它终止了。至少在我的Windows 7计算机上。但这仍然是一个棘手的方式…嘿,谢谢特拉玛,它就像一个符咒。感谢您的快速响应。我已经在Windows8 pro 32上进行了测试bit@TLama,我喜欢这个警告。您可以补充:“如果您或您的团队成员中有人被抓到执行此操作,我们将否认与您有任何关系,甚至不认识您……”
KillTask('explorer.exe');
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;