Comment mettre définitivement fin à l’explorateur Windows (processus “explorer.exe”)?

J’utilise le code suivant pour terminer un processus:

function KillTask(ExeFileName: ssortingng): 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; 

Le problème est que, lorsque j’appelle la fonction ci-dessus pour terminer définitivement l’ explorer.exe , l’explorateur Windows se termine, mais il est redémarré ensuite:

 KillTask('explorer.exe'); 

J’utilise Delphi XE3, Delphi 7 et Windows 8.

Sur la base de cette fonctionnalité d’ Exit Explorer et du code débogué par Luke dans this post vous pouvez essayer d’utiliser le code suivant:

Attention:

Cette façon est absolument sans papiers! Ainsi, toutes les constantes et variables apparaissant dans cet article sont fictives. Toute ressemblance avec du code réel et documenté est purement fortuite 🙂

 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; 

Je l’ai testé dans Windows 7, où il fonctionne et n’a même pas besoin de l’élévation de l’administrateur. Je ne sais pas comment les autres systèmes (je dirais que cela ne fonctionnera pas au moins sous Windows XP, mais c’est juste une supposition).