elguevel
Messages postés718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 12 sept. 2005 à 15:24
{ Tuer un processus }
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;
cs_grandvizir
Messages postés1106Date d'inscriptionsamedi 8 novembre 2003StatutMembreDernière intervention 3 septembre 200622 25 avril 2004 à 18:41
===Commentaire
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à!
korgis
Messages postés420Date d'inscriptionsamedi 17 mai 2003StatutMembreDernière intervention 6 mai 201917 22 sept. 2003 à 02:39
Encore du copier/coller quasiment sans explications... Pfff.....
kanigou
Messages postés6Date d'inscriptiondimanche 26 janvier 2003StatutMembreDernière intervention31 août 2005 14 juin 2003 à 12:05
Moi je trouve ton code pas mal ... Je l'ai utiliser ds un programme qui kill Half-life au bout de 35 minutes ... Pas mal comme ca je joue moins a Cs :) ...
cs_Dagnir
Messages postés18Date d'inscriptionjeudi 24 avril 2003StatutMembreDernière intervention11 février 2009 1 mai 2003 à 10:19
Oui, au mieux il aurait fallu que tu explique chaque variable et la constante et ce qu'il y a dans begin avec // ca pourrait aider les plus novices parceque pour quelqu'un qui n'a jamais vu de code c'est presque inexploitable.
cs_yaco
Messages postés5Date d'inscriptionvendredi 14 février 2003StatutMembreDernière intervention 9 mai 2003 30 mars 2003 à 23:51
mais sa marche pas
eedy31
Messages postés63Date d'inscriptionmercredi 23 janvier 2002StatutMembreDernière intervention16 avril 2008 1 févr. 2002 à 09:44
j'ai rien compris a ton machin!!
pourrait tu mieux expliquer car ca a l'air interressant, pense aux debutants!!!
c ou kon met l'appli kon veu 'killer'?
car je doi faire un petit prog pour mon cher pere.....(va voir au forum : 'help!!!svp les best en delphi')
12 sept. 2005 à 15:24
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;
25 avril 2004 à 18:41
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à!
22 sept. 2003 à 02:39
14 juin 2003 à 12:05
1 mai 2003 à 10:19
30 mars 2003 à 23:51
1 févr. 2002 à 09:44
pourrait tu mieux expliquer car ca a l'air interressant, pense aux debutants!!!
c ou kon met l'appli kon veu 'killer'?
car je doi faire un petit prog pour mon cher pere.....(va voir au forum : 'help!!!svp les best en delphi')