comment faire pour fermer une fenêtre.... - Perl - Programmation
Marsh Posté le 19-07-2004 à 18:51:09
avec Win32-Process:
Code :
|
Marsh Posté le 22-07-2004 à 09:46:49
bonjour,
quand j'essaye de faire le code que vous m'avez donné j'ai les erreurs suivantes:
Name "main::exitcode" used only once
Name "main::pid" used only once
Marsh Posté le 22-07-2004 à 11:33:06
bon...
au moins t'utilise "use strict;", c'est cool!
à la place de $pid tu met le pid du process que tu veux killer, et dans $exitcode t'as k'a mettre 0 et tout ira bien:
Code :
|
Marsh Posté le 22-07-2004 à 11:43:04
j'ai essayé mais ça ne marche pas , mais le problème c'est que je récupère le n°du pid mais comment je fais ensuite pour que se soit ce dernier qui soit pris en compte dans mon script?j'effectue ceci:
Code :
|
Marsh Posté le 22-07-2004 à 11:49:42
?
pourkoi tu met à \n dans ton pid? ca m'etonnerais que ca marche
Bon, si tu vire le \n tu recupere le pid du process en cours et tu le kill. ca revient à faire un 'exit(0)'
en fait c'est koi le process que tu veux killer?
Marsh Posté le 22-07-2004 à 12:08:20
non ça ne marche pas. pour le "\n" c'est une erreur de ma part, même en l'enlèvant ça ne marche pas.
en faite je suis entrain de faire un petit script qui lance vlc, donc je lance mon flux réseau, la pop-up vlc s'ouvre, mais j'aimerais ensuite fermer cette fenêtre dés qu'il a fini d'envoyer le flux.
Marsh Posté le 22-07-2004 à 12:25:19
$$ te donne le pid du porcess de ton script perl!
ce qu'il te faut c'est le pid de ton vlc. tu a dit que tu connaissait le pid du process que tu veux killer mais ca n'est pas le cas.
donc c'est plus chiant...
Le seul moyen que je vois c'est d'ouvire vlc avec Win32-Process.
Tu l'ouvre avec le flag DETACHED_PROCESS pour avoir le meme effaet que le system(1,...) (c'est à dire un lancement asynchrone).
Ensuite tu peux le killer comme tu veux car tu a l'objet Win32-Process associé à vlc.
http://search.cpan.org/~gsar/libwi [...] Process.pm
Marsh Posté le 22-07-2004 à 12:32:15
j'ai vu ce module mais qd j'essaye de l'installer j'ai des soucis???
Marsh Posté le 22-07-2004 à 13:25:49
si t'as activePerl il est deja installé
regrarde dans la doc HTML fournie avec
Marsh Posté le 23-07-2004 à 11:14:57
oui j'ai activeperl, mais je ne pense pas qu'il soit installé car quand je fais un search il ne le trouve?
et quand j'essaye de l'installer j'ai des erreurs?
et j'ai pas trop bien compris comment faire pour remplacer le systeme avec le flag DETACHED_PROCESS?
Marsh Posté le 23-07-2004 à 11:18:46
regarde dans ton menu demaré programme/active state/documentation
et si le module est dans la liste (et il l'est) c'est qu'il est installé
c'est koi ton search? c'est ppm? ca sert à rien: il est DEJA installé!
donc fait simplement un use dans ton script:
Code :
|
Marsh Posté le 23-07-2004 à 11:25:00
oui je l'ai vu, comme vous me l'avez indiqué.Mais comment je fais pour remplacer mon systeme?
Marsh Posté le 23-07-2004 à 11:42:17
j'ai essayé de faire comme vous me l'avez indiqué, mais pour ce que j'ai compris, c'est surement pas ça car en plus j'ai l'erreur suivante:"DETACHED_PROCESS"isn't numeric en subroutine?
voici ce que j'ai fait:
Code :
|
Marsh Posté le 23-07-2004 à 11:53:27
bon, voila en gros comment faire:
Code :
|
donc la on a utilisé la constante CREATE_NEW_CONSOLE pour dire que le process devait se lancer dans une nouvelle console, mais tu peux mettre 0 à la place si tu veux qu'il utilise la meme console que ton script perl (comme le faisait system(1,...)
je t'avais parlé de DETACHED_PROCESS, et si tu l'utilisais (avec un OU logique: 'CREATE_NEW_CONSOLE|DETACHED_PROCESS' pour avoir les deux) ca reviendrait exactement à ton system(1,...), à savoir un process sur lequel tu n'a plus de controle et qui vit sa vie.
la ca n'est pas le cas puisque tu veux pouvoir le killer.
Donc comme tu a gardé l'objet correspondant il te suffit de faire ca pour le killer:
Code :
|
et tu peut aussi utiliser les methodes Suspend et Resume
tout ca est dans ta doc activePerl, ou en ligne: http://aspn.activestate.com/ASPN/d [...] ocess.html
Marsh Posté le 23-07-2004 à 11:55:45
Code :
|
ca ca peut pas marcher à cause de la minuscule à Win32
DETACHED_PROCESS et les autres constantes sont importées par defaut kand tu fais ton use.
Marsh Posté le 23-07-2004 à 12:14:13
Merci!!!ça marche il le lance mais je n'ai pas l'impression qu'il le kill car j'ai toujours ma fenêtre vlc ouverte, je suis obligé de la fermer moi même, est ce normal?j'ai bien fait ce que vous m'avez dit:
-j'ai mis 0 à la place de CREATE_NEW_CONSOLE
-testé demettre 'CREATE_NEW_CONSOLE|DETACHED_PROCESS' ,j'ai la même chose que je mets 0 la fenêtre ne se ferme pas non plus?
Marsh Posté le 23-07-2004 à 12:18:25
si tu (on peux se tutoier non?) met DETACHED_PROCESS alors effectivement tu ne pourra plus le killer
par contre normalement si tu ne met que CREATE_NEW_CONSOLE ou 0 alors tu devrais pouvoir le killer avec la methode approppiée? je sais pas pourkoi ca marche pas.
Peut etre que le processus vcl est deja fini, mais la fenetre cmd reste ouvert.
c'est quelle fenetre que tu voulais fermer au debut de ce topic?
Marsh Posté le 23-07-2004 à 12:23:23
oui on peux se tutoier, of course!c'est la fenêtre vlc que je veux fermer.Et même en mettant 0, elle ne se ferme.
Marsh Posté le 23-07-2004 à 12:26:47
mais avec ton system(1,...) il ouvrait uen fenetre? normalement il reste dans la meme console il me semble
cette fentre c'est la console ou une fenetre graphique ouverte par vlc?
Marsh Posté le 23-07-2004 à 12:37:24
qd je faisais le syteme(1...), j'avais une fenêtre graphique vlc qui s'ouvrait,une pop-up était lancée, comme qd une fenêtre word s'ouvre.
Marsh Posté le 23-07-2004 à 13:50:32
la fenêtre s'ouvre comme prévu, mais à l'éxecution du kill celle-ci ne se ferme pas?est ce normal?
Marsh Posté le 23-07-2004 à 13:55:10
ben non c'est pas normal...
essai la methode GetProcessID(), juste pour voir si l'objet est pas foireux
Marsh Posté le 23-07-2004 à 14:48:24
quand? qui? quoi?
tout à l'heur tu essayait la methode kill et ca killait pas (mais tu n'avait pas l'erreur, du moins tu n'en a pas parlé)
la c'est une methode qui doit te retourné l'ID du process (je pense pas que ce soit le PID mais plutot une ID interne, mais ca reste à verifier), comme c'est expliqué dans la doc. donc fait juste un
Code :
|
et dit moi ce que tu vois (et accessoirement si ca correspond au PID du process de vlc)
Marsh Posté le 23-07-2004 à 15:30:17
et c'est bien celui de vlc? (par rapport à ce que dit le gestionnaire de taches de windows?)
en tous cas ca montre que l'objet est valide
alors essai peut etre ca (sans grande conviction) :
Win32::process::KillProcess($vlc->GetProcessID(), 0)
logiquement ca devrait faire la meme chose (c'est à dire rien?...)
vlc refuse de creuver?!
essai avec un autre prog pour voir (genre notpad par exemple)
peut etre qu'en envoyant -1 comme exitcode ca marcherait? (en parmatere de Kill, ou en deuxiemme parametre de KiiProcess)
Marsh Posté le 23-07-2004 à 15:40:40
ça na marche toujours pas, et c'est bien le numéro de processus de vlc(confirmé par le gestionnaire des tâches),la fenêtre ne se ferme pas mais qd je la ferme contrairement à tout à l'heure j'ai le msg d'erreur suivant:
"can't call method GetProcessID on undefined value"
Marsh Posté le 23-07-2004 à 15:45:53
?
pourtant il avait deja affiché le resultat de cet appel non?
ou alors c'est le second appel dansle KillProcess?
balance ton code pour voir
Marsh Posté le 23-07-2004 à 15:49:31
Voici le code:
Code :
|
Marsh Posté le 23-07-2004 à 15:52:31
et donc il fait le print du pid sans probleme?
et si tu met un print apres le KillPorcess, juste pour voir si il passe à travers ou si il blque dessus?
Kand il t'as affiché le message d'erreur "can't call method GetProcessID on undefined value" tu avait fermé la fenetre avant l'affichage du pid ou apres?
Marsh Posté le 23-07-2004 à 15:58:55
oui le print du pid il le fait sans problème.
et qd je mets un print après le kill je n'ai rien qui s'affiche. mais je pense qu'il kill le pid car normalement j'ai une boucle qui lance le vlc plusieurs fois, et là la boucle est interrompue.
-Kand il m'a affiché le message d'erreur "can't call method GetProcessID on undefined value" j'avais déjà l'affichage du pid et ensuite j'ai fermé la fenêtre.
Marsh Posté le 23-07-2004 à 16:00:54
mais c'est qd même bizarre que la fenêtre vlc soit tjs ouverte?
Marsh Posté le 23-07-2004 à 16:04:46
c'est pas clair ton histoire de boucle et de blocage sur la fonction
essai avec un autre prog que vlc pour voir
par exemple tu fait un script Perl qui affiche un truc toutes les secondes, genre "print ++$a,"\n" while(sleep 1)"
et tu le lance avec Win32-Process (n'oubli pas de mettre l'executable perl comme deuxieme argument: le script lui meme n'est que le parametre passé à perl.exe), et tu vois ce qui ce passe (avec CREATE_NEW_CONSOLE)
Marsh Posté le 13-07-2004 à 11:45:42
bonjour,
voila j'aimerais savoir comment faire en script perl pour fermer une fenêtre d'une application.Je sais que sous linux il suffit de faire un kill -n° du processus mais la je travaille sous windows (activeperl) et je ne sais pas comment le faire. je vous remercie de votre aide.