3

次のコードを使用してプロセスを終了しています。

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 を使用しています。

4

1 に答える 1

9

このExit Explorer機能と Luke によってデバッグされたコードに基づいて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 では動作しないと思いますが、推測にすぎません)。

于 2012-12-07T20:19:56.283 に答える