我正在使用以下代码终止进程:
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。
答案 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上不起作用,但这只是猜测)。