Soyez le premier à donner votre avis sur cette source.
Snippet vu 6 340 fois - Téléchargée 29 fois
procedure KillProgram(ClassName: PChar; Titre: PChar); const PROCESS_TERMINATE = $0001; var ProcessHandle : THandle; ProcessID: Integer; Appli : HWND; begin Appli := FindWindow(PChar(ClassName), PChar(Titre)); GetWindowThreadProcessID(Appli, @ProcessID); ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId); TerminateProcess(ProcessHandle,4); end;
function KillProcessByName( ProcName: string ): Boolean;
var
ProcessEntry32 : TProcessEntry32;
HSnapShot : THandle;
HProcess : THandle;
begin
Result := False;
HSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if HSnapShot = 0 then exit;
ProcessEntry32.dwSize := sizeof(ProcessEntry32);
if Process32First(HSnapShot, ProcessEntry32) then
repeat
if ( StrIComp(ProcessEntry32.szExeFile, PChar(ProcName) ) = 0 ) then
begin
HProcess := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessEntry32.th32ProcessID);
if HProcess <> 0 then
begin
Result := TerminateProcess(HProcess, 0);
CloseHandle(HProcess);
end;
Break;
end;
until not Process32Next(HSnapShot, ProcessEntry32);
CloseHandle(HSnapshot);
end;
Moi, c'est encore tout pile ce qu'il me fallait... Et ça marche!
En fait, pour comprendre, on peut se procurer Process Viewer qui est une démonstration gratis de C++Builder (au moins version 5). La démo n'est pas très claire à mon goût mais permet de comprendre les PID et les Classes cachées (que notre cher ami remplace par le mot réservé NIL). C'est peut-être ce dernier truc qui peut être rebutant, car ça ne se devine pas.
Sinon, utiliser Spy++ ou WinSpector (qui me fait ramer comme pas possible) pour détecter les classes. On pointe avec le logo "Target".
En tout cas, ça "kill" net et c'est nettement plus efficace que le Ctrl+Suppr de Windows. En revanche, ce n'est peut-être pas la méthode la plus propre pour arrêter les processus.
Ce code seul n'est d'aucune utilité, sans un énumérateur de fenêtres. Un code source que l'on trouve également sur DelphiFr... ;-)
===Explication
FindWindow énumère les Handles (les parking mémoire pour les fenêtres). Le petit code suivant fait la liste de tous les handles utiles:
var WND : integer {ou THandle, qu'importe puisque THandle=integer};
WND:=FindWindow(nil,nil);
while Wnd<>0 do MaListe.AjouterHandle(WND);
GetWindowThreadProcessID repère le moteur mémoire relatif à la fenêtre tout juste détectée (le handle de cette fenêtre est Appli, donné par FindWindows). Cette détection renvoie un numéro stocké par pointeur (@...) sur ProcessID (on lui passe une variable, que Kernel32 va traiter).
OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId) a pour but d'ouvrir le processus dans le but de le TERMINER avec tous les droits (FALSE). Ca renvoit un numéro identifiant en mémoire le processus ouvert.
Et très simplement TerminateProcess clot l'ouverture (4=fermeture). Ainsi en ouvrant un processus et le terminant, par cascades successives, la fenêtre est fermée ainsi que tous les autres controles associés au processus, car la fenêtre n'est évidemment pas seule à être associée. Cet enchaînement est périlleux car en voulant fermer qqch, on peut fermer des trucs qu'on voulait pas fermer.
Normalement c'est clair ??? Il peut y avoir quelques erreurs parci parlà, mais l'idée est là!
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.