Effacer la Barre des tâches, le menu Démarrer et toutes les icônes du bureau
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 :
Code:
1 2
| my @Cde = ( $Executable , $ParamFichier , $fichier_txt, $fichier_mp3, $Voix, $Vitesse );
system @Cde; |
Ou même ne serait-ce que :
Code:
1 2 3 4
| sleep(2);
# en Tk il faut faire :
$Wm->after( 2 );
# pour ne pas voir apparaître l'invite de commande |
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 :
Spinoza.bat :
Code:
"C:\Perl\bin\wperl.exe" E:\_APPLI\Spinoza\Spinoza.pl
Une solution consiste à lancer le script Perl par un script .vbs :
Spinoza.vbs :
Code:
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 |
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" :(
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. :D
Si on ne 'Maximize' pas la fenêtre Tk, on peut s’arrêter là :ccool:
Cependant si en Perl/Tk par exemple, on 'Maximize' la fenêtre de façon à occuper tout l'écran :
Code:
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(); |
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 !
La solution consiste donc à effacer la barre des tâches, au moins durant l'exécution de l'appli :
BarEff.pl
Code:
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); |
Et pour tout ré-afficher :
BarAff.pl
Code:
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); |
A vous de récupérer dans les scripts les parties qui vous intéressent :D