comment faire pour fermer une fenêtre....

comment faire pour fermer une fenêtre.... - Perl - Programmation

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.

Reply

Marsh Posté le 13-07-2004 à 11:45:42   

Reply

Marsh Posté le 13-07-2004 à 11:51:02    

ou faire un "ctrl+x" en script perl

Reply

Marsh Posté le 19-07-2004 à 18:51:09    

avec Win32-Process:

Code :
  1. use Win32-Process
  2. Win32::Process::KillProcess($pid, $exitcode)


Message édité par pospos le 19-07-2004 à 18:51:35
Reply

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

Reply

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 :
  1. my $pid = 654; # par exemple
  2. use Win32-Process
  3. Win32::process::KillProcess($pid, 0)


Reply

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 :
  1. # on ferme les fenêtres vlc
  2. print "$$\n";
  3. my $pID="$$\n";
  4. Win32::Process::KillProcess($pid, 0);


Reply

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?


Message édité par pospos le 22-07-2004 à 11:50:17
Reply

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.

Reply

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

Reply

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???

Reply

Marsh Posté le 22-07-2004 à 12:32:15   

Reply

Marsh Posté le 22-07-2004 à 13:25:49    

si t'as activePerl il est deja installé
 
regrarde dans la doc HTML fournie avec

Reply

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?


Message édité par ladym le 23-07-2004 à 11:19:37
Reply

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 :
  1. use Win32::Process;


 
 

Reply

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?

Reply

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 :
  1. #!c:/perl/bin/perl -w
  2. use win32::process;
  3. use Proc::WaitStat;
  4. sub ErrorReport{
  5.         print Win32::FormatMessage( Win32::GetLastError() );
  6.     }
  7.     Win32::Process::Create($pid,"C:\\winnt\\system32\\vlc.exe",
  8.                                 "vlc -vvv udp://$adrIn[$j]",0,
  9.                               DETACHED_PROCESS,"." )|| die ErrorReport();
  10. system ("tethereal -w m.pcap -S -c 50 -T text" );
  11. Win32::Process::KillProcess($pid, 0);


Message édité par ladym le 23-07-2004 à 11:43:57
Reply

Marsh Posté le 23-07-2004 à 11:53:27    

bon, voila en gros comment faire:

Code :
  1. use Win32::Process;
  2. my $vlc_proc;
  3. # c'est un 'new' peut bizarre: tu passe la variable qui contiendra ton objet en premier argument
  4. Win32::Process::Create(
  5. $vlc_proc,
  6. 'C:/tralala/vlc.exe', # le chemin complet vers ton vcl.exe
  7. "vlc arg1 arg2", # la ligne de commande avec les arguments
  8. 0,   # laisse le à 0
  9. CREATE_NEW_CONSOLE, # les constantes qui parametres le processus (priorité, nouvelle console, etc...)
  10. "."   # repertoir de depart pour le processus
  11. ) || die "impossible de lancer le processus";


 
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 :
  1. $vlc_proc->Kill(0);


 
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

Reply

Marsh Posté le 23-07-2004 à 11:55:45    

Code :
  1. use win32::process;


 
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.


Message édité par pospos le 23-07-2004 à 11:55:57
Reply

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?

Reply

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?
 

Reply

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.

Reply

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?

Reply

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.

Reply

Marsh Posté le 23-07-2004 à 13:44:48    

et la?

Reply

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?

Reply

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

Reply

Marsh Posté le 23-07-2004 à 14:41:15    

j'ai exactement la m^me chose que tout à l'heure

Reply

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 :
  1. print $vlc->GetProcessID()

et dit moi ce que tu vois (et accessoirement si ca correspond au PID du process de vlc)

Reply

Marsh Posté le 23-07-2004 à 15:19:49    

oui ça m'affiche un n° de pid

Reply

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)

Reply

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"

Reply

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

Reply

Marsh Posté le 23-07-2004 à 15:49:31    

Voici le code:

Code :
  1. #!c:/perl/bin/perl -w
  2. use win32::process;
  3. use Proc::WaitStat;
  4. my $vlc_proc;
  5. Win32::Process::Create($vlc_proc,"c:\\progra~1\\VideoLAN\\VLC\\VLC.exe", "vlc -vvv udp://$adrIn[$j]",0,0,
  6.          "." )|| die "impossible de lancer le processus";
  7. system ("tethereal -w m.pcap -S -c 50 -T text" );
  8. print $vlc_proc->GetProcessID();
  9. Win32:Process::KillProcess($vlc->GetProcessID(), -1) ;


Message édité par ladym le 23-07-2004 à 15:52:39
Reply

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?

Reply

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.


Message édité par ladym le 23-07-2004 à 15:59:24
Reply

Marsh Posté le 23-07-2004 à 16:00:54    

mais c'est qd même bizarre que la fenêtre vlc soit tjs ouverte?

Reply

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)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed