Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3197 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°794496
ladym
Posté le 13-07-2004 à 11:45:42  profilanswer
 

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.

mood
Publicité
Posté le 13-07-2004 à 11:45:42  profilanswer
 

n°794506
ladym
Posté le 13-07-2004 à 11:51:02  profilanswer
 

ou faire un "ctrl+x" en script perl

n°799890
pospos
Posté le 19-07-2004 à 18:51:09  profilanswer
 

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
n°802774
ladym
Posté le 22-07-2004 à 09:46:49  profilanswer
 

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

n°802915
pospos
Posté le 22-07-2004 à 11:33:06  profilanswer
 

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)


n°802931
ladym
Posté le 22-07-2004 à 11:43:04  profilanswer
 

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);


n°802943
pospos
Posté le 22-07-2004 à 11:49:42  profilanswer
 

?
 
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
n°802972
ladym
Posté le 22-07-2004 à 12:08:20  profilanswer
 

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.

n°803006
pospos
Posté le 22-07-2004 à 12:25:19  profilanswer
 

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

n°803012
ladym
Posté le 22-07-2004 à 12:32:15  profilanswer
 

j'ai vu ce module mais qd j'essaye de l'installer j'ai des soucis???

mood
Publicité
Posté le 22-07-2004 à 12:32:15  profilanswer
 

n°803059
pospos
Posté le 22-07-2004 à 13:25:49  profilanswer
 

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

n°804140
ladym
Posté le 23-07-2004 à 11:14:57  profilanswer
 

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
n°804145
pospos
Posté le 23-07-2004 à 11:18:46  profilanswer
 

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;


 
 

n°804152
ladym
Posté le 23-07-2004 à 11:25:00  profilanswer
 

oui je l'ai vu, comme vous me l'avez indiqué.Mais comment je fais pour remplacer mon systeme?

n°804184
ladym
Posté le 23-07-2004 à 11:42:17  profilanswer
 

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
n°804219
pospos
Posté le 23-07-2004 à 11:53:27  profilanswer
 

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

n°804224
pospos
Posté le 23-07-2004 à 11:55:45  profilanswer
 

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
n°804256
ladym
Posté le 23-07-2004 à 12:14:13  profilanswer
 

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?

n°804263
pospos
Posté le 23-07-2004 à 12:18:25  profilanswer
 

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?
 

n°804269
ladym
Posté le 23-07-2004 à 12:23:23  profilanswer
 

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.

n°804273
pospos
Posté le 23-07-2004 à 12:26:47  profilanswer
 

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?

n°804295
ladym
Posté le 23-07-2004 à 12:37:24  profilanswer
 

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.

n°804387
pospos
Posté le 23-07-2004 à 13:44:48  profilanswer
 

et la?

n°804399
ladym
Posté le 23-07-2004 à 13:50:32  profilanswer
 

la fenêtre s'ouvre comme prévu, mais à l'éxecution du kill celle-ci ne se ferme pas?est ce normal?

n°804401
pospos
Posté le 23-07-2004 à 13:55:10  profilanswer
 

ben non c'est pas normal...
 
essai la methode GetProcessID(), juste pour voir si l'objet est pas foireux

n°804475
ladym
Posté le 23-07-2004 à 14:41:15  profilanswer
 

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

n°804493
pospos
Posté le 23-07-2004 à 14:48:24  profilanswer
 

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)

n°804553
ladym
Posté le 23-07-2004 à 15:19:49  profilanswer
 

oui ça m'affiche un n° de pid

n°804589
pospos
Posté le 23-07-2004 à 15:30:17  profilanswer
 

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)

n°804612
ladym
Posté le 23-07-2004 à 15:40:40  profilanswer
 

ç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"

n°804625
pospos
Posté le 23-07-2004 à 15:45:53  profilanswer
 

?
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

n°804634
ladym
Posté le 23-07-2004 à 15:49:31  profilanswer
 

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
n°804650
pospos
Posté le 23-07-2004 à 15:52:31  profilanswer
 

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?

n°804664
ladym
Posté le 23-07-2004 à 15:58:55  profilanswer
 

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
n°804670
ladym
Posté le 23-07-2004 à 16:00:54  profilanswer
 

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

n°804681
pospos
Posté le 23-07-2004 à 16:04:46  profilanswer
 

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)

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

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

 

Sujets relatifs
[swing] pb pour fermer une fenetrefermer fenetre d'appli windows depuis un batch aprs exec de l'appli
Fermer un popup et actualiser la fenetre qui a lancé le popup[VBS] Quelle est la commande pour fermer une fenêtre IE ?
Confusion de JS: Fermer / actualiser une fenetreFermer la fenêtre dans laquelle on est.
réussir à faire fermer une fenêtre avec un bouton situés sur une autreFermer une fenêtre DOS automatiquement
Fermer une fenetre IE ?[PHP]Fermer une fenêtre :$
Plus de sujets relatifs à : comment faire pour fermer une fenêtre....


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR