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

时间:2012-12-07 19:57:14

标签: windows delphi winapi

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

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.exe时,Windows资源管理器会终止,但之后会重新启动:

KillTask('explorer.exe');

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

1 个答案:

答案 0 :(得分:9)

根据Luke在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上不起作用,但这只是猜测)。