je recherche une maniere de tuer une appli dont j'ai le noms de l'exe
genre "toto.exe" ou "IEXPLORE.exe" par exemple
j'ai trouvé des infos sur comment tuer un process en fonction du titre de la
fenetre (genre "Calculatrice"), mais pas pour tuer directement le process en
exe (ou alors j'ai rien compris aux sources, ce qui est possible aussi
remarquez), car je ne connais pas forcément le noms de la fenetre.
Est ce que cela est possible en VB ? Si q'un avait une idée :o)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
le_troll
Bonjour, c'est quoi "tuer" une appli, est-ce effacer le fichier? -- Merci, @+, bye, Joe
------------------------------------------ Avec une hache, celui qui tient le manche a toujours raison ! ------------------------------------------
"Newb" a écrit dans le message de news: 40a3f598$0$18312$
Bonjour,
je recherche une maniere de tuer une appli dont j'ai le noms de l'exe genre "toto.exe" ou "IEXPLORE.exe" par exemple
j'ai trouvé des infos sur comment tuer un process en fonction du titre de
la
fenetre (genre "Calculatrice"), mais pas pour tuer directement le process
en
exe (ou alors j'ai rien compris aux sources, ce qui est possible aussi remarquez), car je ne connais pas forcément le noms de la fenetre.
Est ce que cela est possible en VB ? Si q'un avait une idée :o)
Merci
Newb
Bonjour, c'est quoi "tuer" une appli, est-ce effacer le fichier?
--
Merci, @+, bye, Joe
montmartre75@iFrance.com
------------------------------------------
Avec une hache, celui qui tient le manche a toujours raison !
------------------------------------------
"Newb" <newb@mail> a écrit dans le message de news:
40a3f598$0$18312$626a14ce@news.free.fr...
Bonjour,
je recherche une maniere de tuer une appli dont j'ai le noms de l'exe
genre "toto.exe" ou "IEXPLORE.exe" par exemple
j'ai trouvé des infos sur comment tuer un process en fonction du titre de
la
fenetre (genre "Calculatrice"), mais pas pour tuer directement le process
en
exe (ou alors j'ai rien compris aux sources, ce qui est possible aussi
remarquez), car je ne connais pas forcément le noms de la fenetre.
Est ce que cela est possible en VB ? Si q'un avait une idée :o)
Bonjour, c'est quoi "tuer" une appli, est-ce effacer le fichier? -- Merci, @+, bye, Joe
------------------------------------------ Avec une hache, celui qui tient le manche a toujours raison ! ------------------------------------------
"Newb" a écrit dans le message de news: 40a3f598$0$18312$
Bonjour,
je recherche une maniere de tuer une appli dont j'ai le noms de l'exe genre "toto.exe" ou "IEXPLORE.exe" par exemple
j'ai trouvé des infos sur comment tuer un process en fonction du titre de
la
fenetre (genre "Calculatrice"), mais pas pour tuer directement le process
en
exe (ou alors j'ai rien compris aux sources, ce qui est possible aussi remarquez), car je ne connais pas forcément le noms de la fenetre.
Est ce que cela est possible en VB ? Si q'un avait une idée :o)
Merci
Newb
Patrick Philippot
Newb wrote:
je recherche une maniere de tuer une appli dont j'ai le noms de l'exe genre "toto.exe" ou "IEXPLORE.exe" par exemple
Je n'ai pas de code VB sous la main mais le principe est le suivant:
1. Enumérer les processus jusqu'à ce que l'on trouve un process ayant le nom requis. L'énumération se fait de manière différente sous NT+ et Win9x. On utilise EnumProcesses, OpenProcess, EnumProcessModules dans le premiers cas (voir doc sur PSAPI) et CreateToolhelp32Snapshot, Process32First, Process32Next dans l'autre (voir doc sur ToolHelp32). Dans les 2 cas, on récupère le pid au passage.
2. Quand on a le pid, on peut utiliser OpenProcess pour récupérer le handle du process.
3. Quand on a le handle du process, on a fini : TerminateProcess.
-- Patrick Philippot - Microsoft MVP [.Net] MainSoft Consulting Services www.mainsoft.fr
Newb wrote:
je recherche une maniere de tuer une appli dont j'ai le noms de l'exe
genre "toto.exe" ou "IEXPLORE.exe" par exemple
Je n'ai pas de code VB sous la main mais le principe est le suivant:
1. Enumérer les processus jusqu'à ce que l'on trouve un process ayant le
nom requis. L'énumération se fait de manière différente sous NT+ et
Win9x. On utilise EnumProcesses, OpenProcess, EnumProcessModules dans le
premiers cas (voir doc sur PSAPI) et CreateToolhelp32Snapshot,
Process32First, Process32Next dans l'autre (voir doc sur ToolHelp32).
Dans les 2 cas, on récupère le pid au passage.
2. Quand on a le pid, on peut utiliser OpenProcess pour récupérer le
handle du process.
3. Quand on a le handle du process, on a fini : TerminateProcess.
--
Patrick Philippot - Microsoft MVP [.Net]
MainSoft Consulting Services
www.mainsoft.fr
je recherche une maniere de tuer une appli dont j'ai le noms de l'exe genre "toto.exe" ou "IEXPLORE.exe" par exemple
Je n'ai pas de code VB sous la main mais le principe est le suivant:
1. Enumérer les processus jusqu'à ce que l'on trouve un process ayant le nom requis. L'énumération se fait de manière différente sous NT+ et Win9x. On utilise EnumProcesses, OpenProcess, EnumProcessModules dans le premiers cas (voir doc sur PSAPI) et CreateToolhelp32Snapshot, Process32First, Process32Next dans l'autre (voir doc sur ToolHelp32). Dans les 2 cas, on récupère le pid au passage.
2. Quand on a le pid, on peut utiliser OpenProcess pour récupérer le handle du process.
3. Quand on a le handle du process, on a fini : TerminateProcess.
-- Patrick Philippot - Microsoft MVP [.Net] MainSoft Consulting Services www.mainsoft.fr
François Picalausa
Hello,
pour compléter: http://support.microsoft.com/?id2986
tu devrais aussi avant de d'utiliser Terminateprocess envoyer un WM_CLOSe a la fenêtre principale du thread. Pour celà, il faut enumérer les windows et à partir de GetWindowProcessId récupérer le process ID. Si les deux processID correspondent, tu as une fenêtre à laquelle envoyer un WM_CLOSE Ou du moins si le hwnd n'a pas de parent (Getparent = 0) tu peux lui envoyer un WM_CLOSE.
Voici un article décrivant complètement cette méthode: http://msdn.microsoft.com/library/en-us/dnvsm01/html/dt0109.asp
ou encore, cet exemple du même auteur: tasklist http://www.mvps.org/vb/samples.htm
-- François Picalausa (MVP VB) http://faq.vb.free.fr --- http://msdn.microsoft.com http://apisvb.europe.webmatrixhosting.net
"Patrick Philippot" a écrit dans le message de news:
Newb wrote:
je recherche une maniere de tuer une appli dont j'ai le noms de l'exe genre "toto.exe" ou "IEXPLORE.exe" par exemple
Je n'ai pas de code VB sous la main mais le principe est le suivant:
1. Enumérer les processus jusqu'à ce que l'on trouve un process ayant le nom requis. L'énumération se fait de manière différente sous NT+ et Win9x. On utilise EnumProcesses, OpenProcess, EnumProcessModules dans le premiers cas (voir doc sur PSAPI) et CreateToolhelp32Snapshot, Process32First, Process32Next dans l'autre (voir doc sur ToolHelp32). Dans les 2 cas, on récupère le pid au passage.
2. Quand on a le pid, on peut utiliser OpenProcess pour récupérer le handle du process.
3. Quand on a le handle du process, on a fini : TerminateProcess.
Hello,
pour compléter:
http://support.microsoft.com/?id2986
tu devrais aussi avant de d'utiliser Terminateprocess envoyer un WM_CLOSe a
la fenêtre principale du thread.
Pour celà, il faut enumérer les windows et à partir de GetWindowProcessId
récupérer le process ID.
Si les deux processID correspondent, tu as une fenêtre à laquelle envoyer un
WM_CLOSE
Ou du moins si le hwnd n'a pas de parent (Getparent = 0) tu peux lui envoyer
un WM_CLOSE.
Voici un article décrivant complètement cette méthode:
http://msdn.microsoft.com/library/en-us/dnvsm01/html/dt0109.asp
ou encore, cet exemple du même auteur: tasklist
http://www.mvps.org/vb/samples.htm
--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net
"Patrick Philippot" <patrick.philippot@mainsoft.xx> a écrit dans le
message de news:ueaWVJYOEHA.1456@TK2MSFTNGP09.phx.gbl
Newb wrote:
je recherche une maniere de tuer une appli dont j'ai le noms de l'exe
genre "toto.exe" ou "IEXPLORE.exe" par exemple
Je n'ai pas de code VB sous la main mais le principe est le suivant:
1. Enumérer les processus jusqu'à ce que l'on trouve un process ayant
le nom requis. L'énumération se fait de manière différente sous NT+ et
Win9x. On utilise EnumProcesses, OpenProcess, EnumProcessModules dans
le premiers cas (voir doc sur PSAPI) et CreateToolhelp32Snapshot,
Process32First, Process32Next dans l'autre (voir doc sur ToolHelp32).
Dans les 2 cas, on récupère le pid au passage.
2. Quand on a le pid, on peut utiliser OpenProcess pour récupérer le
handle du process.
3. Quand on a le handle du process, on a fini : TerminateProcess.
pour compléter: http://support.microsoft.com/?id2986
tu devrais aussi avant de d'utiliser Terminateprocess envoyer un WM_CLOSe a la fenêtre principale du thread. Pour celà, il faut enumérer les windows et à partir de GetWindowProcessId récupérer le process ID. Si les deux processID correspondent, tu as une fenêtre à laquelle envoyer un WM_CLOSE Ou du moins si le hwnd n'a pas de parent (Getparent = 0) tu peux lui envoyer un WM_CLOSE.
Voici un article décrivant complètement cette méthode: http://msdn.microsoft.com/library/en-us/dnvsm01/html/dt0109.asp
ou encore, cet exemple du même auteur: tasklist http://www.mvps.org/vb/samples.htm
-- François Picalausa (MVP VB) http://faq.vb.free.fr --- http://msdn.microsoft.com http://apisvb.europe.webmatrixhosting.net
"Patrick Philippot" a écrit dans le message de news:
Newb wrote:
je recherche une maniere de tuer une appli dont j'ai le noms de l'exe genre "toto.exe" ou "IEXPLORE.exe" par exemple
Je n'ai pas de code VB sous la main mais le principe est le suivant:
1. Enumérer les processus jusqu'à ce que l'on trouve un process ayant le nom requis. L'énumération se fait de manière différente sous NT+ et Win9x. On utilise EnumProcesses, OpenProcess, EnumProcessModules dans le premiers cas (voir doc sur PSAPI) et CreateToolhelp32Snapshot, Process32First, Process32Next dans l'autre (voir doc sur ToolHelp32). Dans les 2 cas, on récupère le pid au passage.
2. Quand on a le pid, on peut utiliser OpenProcess pour récupérer le handle du process.
3. Quand on a le handle du process, on a fini : TerminateProcess.
Newb
Bonjour, non en fait il s'agit de fermer l'appli, genre Alt +F4 mais en plus brutale quoi :-)
"le_troll" a écrit dans le message de news:
Bonjour, c'est quoi "tuer" une appli, est-ce effacer le fichier? -- Merci, @+, bye, Joe
------------------------------------------ Avec une hache, celui qui tient le manche a toujours raison ! ------------------------------------------
"Newb" a écrit dans le message de news: 40a3f598$0$18312$ > Bonjour, > > je recherche une maniere de tuer une appli dont j'ai le noms de l'exe > genre "toto.exe" ou "IEXPLORE.exe" par exemple > > j'ai trouvé des infos sur comment tuer un process en fonction du titre
de
la > fenetre (genre "Calculatrice"), mais pas pour tuer directement le
process
en > exe (ou alors j'ai rien compris aux sources, ce qui est possible aussi > remarquez), car je ne connais pas forcément le noms de la fenetre. > > Est ce que cela est possible en VB ? Si q'un avait une idée :o) > > Merci > > Newb > >
Bonjour, non en fait il s'agit de fermer l'appli, genre Alt +F4 mais en plus
brutale quoi :-)
"le_troll" <le_trol@paris.fr> a écrit dans le message de
news:OyQN2EYOEHA.584@TK2MSFTNGP10.phx.gbl...
Bonjour, c'est quoi "tuer" une appli, est-ce effacer le fichier?
--
Merci, @+, bye, Joe
montmartre75@iFrance.com
------------------------------------------
Avec une hache, celui qui tient le manche a toujours raison !
------------------------------------------
"Newb" <newb@mail> a écrit dans le message de news:
40a3f598$0$18312$626a14ce@news.free.fr...
> Bonjour,
>
> je recherche une maniere de tuer une appli dont j'ai le noms de l'exe
> genre "toto.exe" ou "IEXPLORE.exe" par exemple
>
> j'ai trouvé des infos sur comment tuer un process en fonction du titre
de
la
> fenetre (genre "Calculatrice"), mais pas pour tuer directement le
process
en
> exe (ou alors j'ai rien compris aux sources, ce qui est possible aussi
> remarquez), car je ne connais pas forcément le noms de la fenetre.
>
> Est ce que cela est possible en VB ? Si q'un avait une idée :o)
>
> Merci
>
> Newb
>
>
Bonjour, non en fait il s'agit de fermer l'appli, genre Alt +F4 mais en plus brutale quoi :-)
"le_troll" a écrit dans le message de news:
Bonjour, c'est quoi "tuer" une appli, est-ce effacer le fichier? -- Merci, @+, bye, Joe
------------------------------------------ Avec une hache, celui qui tient le manche a toujours raison ! ------------------------------------------
"Newb" a écrit dans le message de news: 40a3f598$0$18312$ > Bonjour, > > je recherche une maniere de tuer une appli dont j'ai le noms de l'exe > genre "toto.exe" ou "IEXPLORE.exe" par exemple > > j'ai trouvé des infos sur comment tuer un process en fonction du titre
de
la > fenetre (genre "Calculatrice"), mais pas pour tuer directement le
process
en > exe (ou alors j'ai rien compris aux sources, ce qui est possible aussi > remarquez), car je ne connais pas forcément le noms de la fenetre. > > Est ce que cela est possible en VB ? Si q'un avait une idée :o) > > Merci > > Newb > >
Newb
Ok, merci beaucoup a tous le 2, je vais essayer ca (pas sur d'y arriver, mais faut essayer avant d'en etre sur ;-))
"François Picalausa" a écrit dans le message de news:
Hello,
pour compléter: http://support.microsoft.com/?id2986
tu devrais aussi avant de d'utiliser Terminateprocess envoyer un WM_CLOSe
a
la fenêtre principale du thread. Pour celà, il faut enumérer les windows et à partir de GetWindowProcessId récupérer le process ID. Si les deux processID correspondent, tu as une fenêtre à laquelle envoyer
un
WM_CLOSE Ou du moins si le hwnd n'a pas de parent (Getparent = 0) tu peux lui
envoyer
un WM_CLOSE.
Voici un article décrivant complètement cette méthode: http://msdn.microsoft.com/library/en-us/dnvsm01/html/dt0109.asp
ou encore, cet exemple du même auteur: tasklist http://www.mvps.org/vb/samples.htm
-- François Picalausa (MVP VB) http://faq.vb.free.fr --- http://msdn.microsoft.com http://apisvb.europe.webmatrixhosting.net
"Patrick Philippot" a écrit dans le message de news: > Newb wrote: >> je recherche une maniere de tuer une appli dont j'ai le noms de l'exe >> genre "toto.exe" ou "IEXPLORE.exe" par exemple > > Je n'ai pas de code VB sous la main mais le principe est le suivant: > > 1. Enumérer les processus jusqu'à ce que l'on trouve un process ayant > le nom requis. L'énumération se fait de manière différente sous NT+ et > Win9x. On utilise EnumProcesses, OpenProcess, EnumProcessModules dans > le premiers cas (voir doc sur PSAPI) et CreateToolhelp32Snapshot, > Process32First, Process32Next dans l'autre (voir doc sur ToolHelp32). > Dans les 2 cas, on récupère le pid au passage. > > 2. Quand on a le pid, on peut utiliser OpenProcess pour récupérer le > handle du process. > > 3. Quand on a le handle du process, on a fini : TerminateProcess.
Ok, merci beaucoup a tous le 2, je vais essayer ca (pas sur d'y arriver,
mais faut essayer avant d'en etre sur ;-))
"François Picalausa" <fpicalausa@chez.com> a écrit dans le message de
news:ubngIvYOEHA.3420@TK2MSFTNGP11.phx.gbl...
Hello,
pour compléter:
http://support.microsoft.com/?id2986
tu devrais aussi avant de d'utiliser Terminateprocess envoyer un WM_CLOSe
a
la fenêtre principale du thread.
Pour celà, il faut enumérer les windows et à partir de GetWindowProcessId
récupérer le process ID.
Si les deux processID correspondent, tu as une fenêtre à laquelle envoyer
un
WM_CLOSE
Ou du moins si le hwnd n'a pas de parent (Getparent = 0) tu peux lui
envoyer
un WM_CLOSE.
Voici un article décrivant complètement cette méthode:
http://msdn.microsoft.com/library/en-us/dnvsm01/html/dt0109.asp
ou encore, cet exemple du même auteur: tasklist
http://www.mvps.org/vb/samples.htm
--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net
"Patrick Philippot" <patrick.philippot@mainsoft.xx> a écrit dans le
message de news:ueaWVJYOEHA.1456@TK2MSFTNGP09.phx.gbl
> Newb wrote:
>> je recherche une maniere de tuer une appli dont j'ai le noms de l'exe
>> genre "toto.exe" ou "IEXPLORE.exe" par exemple
>
> Je n'ai pas de code VB sous la main mais le principe est le suivant:
>
> 1. Enumérer les processus jusqu'à ce que l'on trouve un process ayant
> le nom requis. L'énumération se fait de manière différente sous NT+ et
> Win9x. On utilise EnumProcesses, OpenProcess, EnumProcessModules dans
> le premiers cas (voir doc sur PSAPI) et CreateToolhelp32Snapshot,
> Process32First, Process32Next dans l'autre (voir doc sur ToolHelp32).
> Dans les 2 cas, on récupère le pid au passage.
>
> 2. Quand on a le pid, on peut utiliser OpenProcess pour récupérer le
> handle du process.
>
> 3. Quand on a le handle du process, on a fini : TerminateProcess.
Ok, merci beaucoup a tous le 2, je vais essayer ca (pas sur d'y arriver, mais faut essayer avant d'en etre sur ;-))
"François Picalausa" a écrit dans le message de news:
Hello,
pour compléter: http://support.microsoft.com/?id2986
tu devrais aussi avant de d'utiliser Terminateprocess envoyer un WM_CLOSe
a
la fenêtre principale du thread. Pour celà, il faut enumérer les windows et à partir de GetWindowProcessId récupérer le process ID. Si les deux processID correspondent, tu as une fenêtre à laquelle envoyer
un
WM_CLOSE Ou du moins si le hwnd n'a pas de parent (Getparent = 0) tu peux lui
envoyer
un WM_CLOSE.
Voici un article décrivant complètement cette méthode: http://msdn.microsoft.com/library/en-us/dnvsm01/html/dt0109.asp
ou encore, cet exemple du même auteur: tasklist http://www.mvps.org/vb/samples.htm
-- François Picalausa (MVP VB) http://faq.vb.free.fr --- http://msdn.microsoft.com http://apisvb.europe.webmatrixhosting.net
"Patrick Philippot" a écrit dans le message de news: > Newb wrote: >> je recherche une maniere de tuer une appli dont j'ai le noms de l'exe >> genre "toto.exe" ou "IEXPLORE.exe" par exemple > > Je n'ai pas de code VB sous la main mais le principe est le suivant: > > 1. Enumérer les processus jusqu'à ce que l'on trouve un process ayant > le nom requis. L'énumération se fait de manière différente sous NT+ et > Win9x. On utilise EnumProcesses, OpenProcess, EnumProcessModules dans > le premiers cas (voir doc sur PSAPI) et CreateToolhelp32Snapshot, > Process32First, Process32Next dans l'autre (voir doc sur ToolHelp32). > Dans les 2 cas, on récupère le pid au passage. > > 2. Quand on a le pid, on peut utiliser OpenProcess pour récupérer le > handle du process. > > 3. Quand on a le handle du process, on a fini : TerminateProcess.
Zoury
Bonjour, non en fait il s'agit de fermer l'appli, genre Alt +F4 mais en plus
brutale quoi :-)
Envoyé le message WM_CLOSE, comme l'a mentionné François, fait la même chose que Alt-F4. Cela permet au programme d'exécuter le code qu'il doit exécuter avant de se fermer, ce qui lui laisse la possibilité de sauvegardé les modifs, et libérer la mémoire.
Bonjour, non en fait il s'agit de fermer l'appli, genre Alt +F4 mais en
plus
brutale quoi :-)
Envoyé le message WM_CLOSE, comme l'a mentionné François, fait la même chose
que Alt-F4. Cela permet au programme d'exécuter le code qu'il doit exécuter
avant de se fermer, ce qui lui laisse la possibilité de sauvegardé les
modifs, et libérer la mémoire.
Bonjour, non en fait il s'agit de fermer l'appli, genre Alt +F4 mais en plus
brutale quoi :-)
Envoyé le message WM_CLOSE, comme l'a mentionné François, fait la même chose que Alt-F4. Cela permet au programme d'exécuter le code qu'il doit exécuter avant de se fermer, ce qui lui laisse la possibilité de sauvegardé les modifs, et libérer la mémoire.
> Envoyé le message WM_CLOSE, comme l'a mentionné François, fait la même chose que Alt-F4. Cela permet au programme d'exécuter le code qu'il doit exécuter avant de se fermer, ce qui lui laisse la possibilité de sauvegardé les modifs, et libérer la mémoire.
TerminateProcess() ne fait pas ça..
En fait, (tenter de) terminer proprement un process externe est une affaire assez compliquée. Il y a un utilitaire de PC Mag sont le code source était disponible à la belle époque (celle où je bossais pour eux :-) ) et qui utilise une méthode assez propre: EndItAll de Neil Rubenking. L'article est toutefois toujours en ligne si le code source n'est plus dispo: http://www.pcmag.com/article2/0,1759,1935,00.asp (section Inside EnditAll). Cet article contient d'autres références.
La manière de procéder est la suivante:
1. On énumère toutes les fenêtres de l'appli (pas seulement la fenêtre principale) et on leur expédie un WM_CLOSE.
2. On essaie ensuite une méthode propre qui consiste à faire un DuplicateHandle sur le handle du process, à récupérer la fonction ExitProcess dans kernel32 et à utiliser CreateRemoteThread (on crée le thread sur ExitProcess) pour terminer le processus. Cette étape ne fonctionne que sur NT et au-dessus. Elle consiste en fait à faire exécuter un ExitProcess par le process cible lui-même. Bien sûr, ça ne marche pas à tous les coups mais souvent.
3. On fait un WaitForsingleObject sur le handle dupliqué (ou l'original si la duplication s'est plantée) et si au bout d'un certain temps le process est toujours vivant, là on fait un TerminateProcess.
4. Comme nous sommes des gens très clean, on n'oublie pas non plus que l'appli en question pouvait avoir une icône dans le system tray. Là, un seul moyen de la pulvériser, aller balader la souris dans cette zone par programme.
-- Patrick Philippot - Microsoft MVP [.Net] MainSoft Consulting Services www.mainsoft.fr
> Envoyé le message WM_CLOSE, comme l'a mentionné François, fait la
même chose que Alt-F4. Cela permet au programme d'exécuter le code
qu'il doit exécuter avant de se fermer, ce qui lui laisse la
possibilité de sauvegardé les modifs, et libérer la mémoire.
TerminateProcess() ne fait pas ça..
En fait, (tenter de) terminer proprement un process externe est une
affaire assez compliquée. Il y a un utilitaire de PC Mag sont le code
source était disponible à la belle époque (celle où je bossais pour eux
:-) ) et qui utilise une méthode assez propre: EndItAll de Neil
Rubenking. L'article est toutefois toujours en ligne si le code source
n'est plus dispo: http://www.pcmag.com/article2/0,1759,1935,00.asp
(section Inside EnditAll). Cet article contient d'autres références.
La manière de procéder est la suivante:
1. On énumère toutes les fenêtres de l'appli (pas seulement la fenêtre
principale) et on leur expédie un WM_CLOSE.
2. On essaie ensuite une méthode propre qui consiste à faire un
DuplicateHandle sur le handle du process, à récupérer la fonction
ExitProcess dans kernel32 et à utiliser CreateRemoteThread (on crée le
thread sur ExitProcess) pour terminer le processus. Cette étape ne
fonctionne que sur NT et au-dessus. Elle consiste en fait à faire
exécuter un ExitProcess par le process cible lui-même. Bien sûr, ça ne
marche pas à tous les coups mais souvent.
3. On fait un WaitForsingleObject sur le handle dupliqué (ou l'original
si la duplication s'est plantée) et si au bout d'un certain temps le
process est toujours vivant, là on fait un TerminateProcess.
4. Comme nous sommes des gens très clean, on n'oublie pas non plus que
l'appli en question pouvait avoir une icône dans le system tray. Là, un
seul moyen de la pulvériser, aller balader la souris dans cette zone par
programme.
--
Patrick Philippot - Microsoft MVP [.Net]
MainSoft Consulting Services
www.mainsoft.fr
> Envoyé le message WM_CLOSE, comme l'a mentionné François, fait la même chose que Alt-F4. Cela permet au programme d'exécuter le code qu'il doit exécuter avant de se fermer, ce qui lui laisse la possibilité de sauvegardé les modifs, et libérer la mémoire.
TerminateProcess() ne fait pas ça..
En fait, (tenter de) terminer proprement un process externe est une affaire assez compliquée. Il y a un utilitaire de PC Mag sont le code source était disponible à la belle époque (celle où je bossais pour eux :-) ) et qui utilise une méthode assez propre: EndItAll de Neil Rubenking. L'article est toutefois toujours en ligne si le code source n'est plus dispo: http://www.pcmag.com/article2/0,1759,1935,00.asp (section Inside EnditAll). Cet article contient d'autres références.
La manière de procéder est la suivante:
1. On énumère toutes les fenêtres de l'appli (pas seulement la fenêtre principale) et on leur expédie un WM_CLOSE.
2. On essaie ensuite une méthode propre qui consiste à faire un DuplicateHandle sur le handle du process, à récupérer la fonction ExitProcess dans kernel32 et à utiliser CreateRemoteThread (on crée le thread sur ExitProcess) pour terminer le processus. Cette étape ne fonctionne que sur NT et au-dessus. Elle consiste en fait à faire exécuter un ExitProcess par le process cible lui-même. Bien sûr, ça ne marche pas à tous les coups mais souvent.
3. On fait un WaitForsingleObject sur le handle dupliqué (ou l'original si la duplication s'est plantée) et si au bout d'un certain temps le process est toujours vivant, là on fait un TerminateProcess.
4. Comme nous sommes des gens très clean, on n'oublie pas non plus que l'appli en question pouvait avoir une icône dans le system tray. Là, un seul moyen de la pulvériser, aller balader la souris dans cette zone par programme.
-- Patrick Philippot - Microsoft MVP [.Net] MainSoft Consulting Services www.mainsoft.fr
Zoury
Salut Patrick!
L'article est toutefois toujours en ligne si le code source n'est plus dispo: http://www.pcmag.com/article2/0,1759,1935,00.asp
pour les intéresser il y a aussi l'article de Karl E. Peterson qui touche à ce sujet. c'est un classique ;O)
How to kill an app gently http://msdn.microsoft.com/library/en-us/dnvsm01/html/dt0109.asp
et un exemple de la technique est démontré ici http://www.mvps.org/vb/samples.htm
j'imagine que le code de pcMag devait ressembler à ça. ;O)