Bonjour,
En Perl et notamment avec Tk j'ai rencontré quelques effets indésirables.
Je propose quelques solutions, qui si elles n'ont rien de compliqué, m'ont demandé des heures de recherche pour trouver les bons paramètres des API.
NB : les scripts utilisant Win32::API ont été testés avec Windows 7 UNIQUEMENT, il y a des différences avec les autres Windows !
En Perl/Tk lorsqu'on fait appel au système par exemple :
Ou même ne serait-ce que :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 my @Cde = ( $Executable , $ParamFichier , $fichier_txt, $fichier_mp3, $Voix, $Vitesse ); system @Cde;
On a la désagréable surprise de voir apparaître une invite de commande, même si le script Perl a été lancé avec wperl.exe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 sleep(2); # en Tk il faut faire : $Wm->after( 2 ); # pour ne pas voir apparaître l'invite de commande
Spinoza.bat :
Une solution consiste à lancer le script Perl par un script .vbs :
Code : Sélectionner tout - Visualiser dans une fenêtre à part "C:\Perl\bin\wperl.exe" E:\_APPLI\Spinoza\Spinoza.pl
Spinoza.vbs :
Ici l'inconvénient est que si un EXPLORATEUR DE FICHIERS est ouvert sur le bureau, il passe au premier plan au moindre "Appel système"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 ' Fonctionne dans [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] ' ou dans [HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] ' Fonctionne dans menu Démarrer Set WshShell = WScript.CreateObject("WScript.Shell") strData=WshShell.ExpandEnvironmentStrings("%AppData%") WshShell.CurrentDirectory = strData WshShell.Run chr(34) & "E:\_APPLI\Spinoza\Spinoza.bat" & Chr(34), 0 Set WshShell = Nothing WScript.Quit
La solution consiste à n'avoir ni INVITE DE COMMMANDE ni EXPLORATEUR ni AUCUNE autre fenêtre d'ouverte sur le bureau,
et à placer un raccourci du .vbs sur le bureau.
Maintenant il n'y a plus d'ouverture intempestive de fenêtre.
Si on ne 'Maximize' pas la fenêtre Tk, on peut s’arrêter là
Cependant si en Perl/Tk par exemple, on 'Maximize' la fenêtre de façon à occuper tout l'écran :
Lorsqu'il y a un "Appel système" c'est la BARRE DES TACHES qui apparaît et qui vient masquer le bas de la fenêtre maximisée Tk !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 # Creation du widget principal my $Wm = MainWindow->new( -width => $width, -height => $height, -title => "Spinoza", -background => 'white', ); $width = $Wm->screenwidth; $height = $Wm->screenheight; $Wm->configure(-height=>$height, -width=>$width, -title=>"Spinoza"); $Wm->geometry( $width ."x". $height ); $Wm->MoveToplevelWindow (0,0); $Wm->overrideredirect(1); $Wm->packPropagate(0); $Wm->raise();
La solution consiste donc à effacer la barre des tâches, au moins durant l'exécution de l'appli :
BarEff.pl
Et pour tout ré-afficher :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 #!/usr/bin/perl use strict; use warnings; use utf8; use Win32::API; $Win32::API::DEBUG = 0; # # ATTENTION le lancement du script tel quel efface toutes les icônes du bureau ansi que la barre des tâches # Il est alors IMPOSSIBLE de lancer quoi que ce soit ! # # RAPPEL la touche WINDOWS du clavier permet de développer le menu Démarrer à partir duquel on peut lancer # une INVITE DE COMMANDE qui permettra le réaffichage de toutes les icônes : # perl BarAff.pl # # Le mieux, avant de lancer le script, est d'ouvrir une INVITE DE COMMANDE... # # Paramètres de la barre des tâches (Taskbar) my $lpBarClass = ""; my $lpBarName = "Shell_traywnd"; # Paramètres du bureau (Desktop) my $lpWndName = "ProgMan"; my $lpWndClass = "Program Manager"; # Création des structures permettant d'accéder aux API my $GetDesktopWindow = new Win32::API('user32', 'GetDesktopWindow','','I'); my $FindWindowEx = new Win32::API('user32', 'FindWindowEx','IIPP','I'); my $ShowWindow = new Win32::API('user32', 'ShowWindow','II','I'); # Efface la barre des taches sauf le bouton du menu Démarrer my $hbar = $FindWindowEx->Call( 0, 0, $lpBarName, $lpBarClass ); my $Eventbar = $ShowWindow->Call( $hbar, 0); # Efface les icônes du bureau my $hwnd = $FindWindowEx->Call( 0, 0, $lpWndName, $lpWndClass ); my $Eventwnd = $ShowWindow->Call( $hwnd, 0); # Efface le bouton du menu Démmarer lorsque la barre des tâches est déjà effacée my $hdsk = $GetDesktopWindow->Call(); my $hbtn = $FindWindowEx->Call($hdsk, 0, 'button', 0); my $Eventbtn = $ShowWindow->Call($hbtn, 0); exit (0);
BarAff.pl
A vous de récupérer dans les scripts les parties qui vous intéressent
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 #!/usr/bin/perl use strict; use warnings; use utf8; use Win32::API; $Win32::API::DEBUG = 0; # Paramètres de la barre des tâches (Taskbar) my $lpBarClass = ""; my $lpBarName = "Shell_traywnd"; # Paramètres du bureau (Desktop) my $lpWndName = "ProgMan"; my $lpWndClass = "Program Manager"; # Création des structures permettant d'accéder aux API my $GetDesktopWindow = new Win32::API('user32', 'GetDesktopWindow','','I'); my $FindWindowEx = new Win32::API('user32', 'FindWindowEx','IIPP','I'); my $ShowWindow = new Win32::API('user32', 'ShowWindow','II','I'); # Affiche la barre des taches avec menu Démarrer my $hbar = $FindWindowEx->Call( 0, 0, $lpBarName, $lpBarClass ); my $Eventbar = $ShowWindow->Call( $hbar, 5); # Affiche les icônes du bureau my $hwnd = $FindWindowEx->Call( 0, 0, $lpWndName, $lpWndClass ); my $Eventwnd = $ShowWindow->Call( $hwnd, 5); # Affiche le bouton du menu Démmarer my $hdsk = $GetDesktopWindow->Call(); my $hbtn = $FindWindowEx->Call($hdsk, 0, 'button', 0); my $Eventbtn = $ShowWindow->Call($hbtn, 5); exit (0);
Partager