IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces Graphiques Perl Discussion :

Effacer la Barre des tâches, le menu Démarrer et toutes les icônes du bureau


Sujet :

Interfaces Graphiques Perl

  1. #1
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    septembre 2011
    Messages
    1 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : septembre 2011
    Messages : 1 376
    Points : 2 023
    Points
    2 023
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my @Cde = ( $Executable , $ParamFichier , $fichier_txt, $fichier_mp3, $Voix, $Vitesse );
    system @Cde;
    Ou même ne serait-ce que :
    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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    "C:\Perl\bin\wperl.exe" E:\_APPLI\Spinoza\Spinoza.pl
    Une solution consiste à lancer le script Perl par un script .vbs :
    Spinoza.vbs :
    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
    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.
    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 :
    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();
    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 : 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);
    Et pour tout ré-afficher :
    BarAff.pl
    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);
    A vous de récupérer dans les scripts les parties qui vous intéressent

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    19 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 19 793
    Points : 499 019
    Points
    499 019
    Par défaut
    Bonjour,

    Lancer des commandes système depuis Tk, c'est vrai que c'est lourd car cela lance une fenêtre DOS. Bon, je ne sais pas s'il existe vraiment un moyen de l'éviter.
    Je vais essayer de tester ta méthode, mais il faudrait qu'elle soit compatible sur toutes les machines Windows de XP à 8.1.

    J'aime bien aussi pouvoir écrire des programmes compatibles avec Linux, mais pour le moment, on va se limiter à Windows .

  3. #3
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    19 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 19 793
    Points : 499 019
    Points
    499 019
    Par défaut
    As-tu essayé d'utiliser le module Win32::Process pour lancer tes commandes système ?

  4. #4
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    septembre 2011
    Messages
    1 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : septembre 2011
    Messages : 1 376
    Points : 2 023
    Points
    2 023
    Par défaut
    Bonjour djibril,
    Lancer des commandes système depuis Tk, c'est vrai que c'est lourd car cela lance une fenêtre DOS. Bon, je ne sais pas s'il existe vraiment un moyen de l'éviter.
    Ce n'est pas seulement lancer les programmes qui est lourd en Tk, déjà un simple sleep fait remonter une fenêtre DOS.
    Tu te souviens de mes débuts en Tk j'avais libellé : "Fenêtre Tk clignote avec fenêtre DOS".
    J'avais résolu en remplaçant les sleep() par des $Wm->after().
    Là je lance Balabolka.exe sans pb, pourvu qu'il n'y ait pas de fenêtre DOS ou EXPLORATEUR déjà ouvertes et que je ne fasse pas un sleep et Tk.

    Je vais essayer de tester ta méthode, mais il faudrait qu'elle soit compatible sur toutes les machines Windows de XP à 8.1.
    J'ai encore toute la gamme, mais n'ai pas Perl sur XP.
    Je ferai des tests et te donnerai des nouvelles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    J'aime bien aussi pouvoir écrire des programmes compatibles avec Linux, mais pour le moment, on va se limiter à Windows .
    J'ai quasiment abandonné Linux pour un ancien d'Unix c'est la honte, mais j'ai eu quelques mauvaises surprises avec les derniers Ubuntu et Debian. Win 7 tourne bien, mais surtout je n'ai pas les mêmes besoins que lorsque j'étais en activité.

    Le module Win32::API en Perl m'a permis de faire 3 ou 4 choses intéressantes plutôt facilement, hors mis les recherches sur le net pour trouver les paramètres

    As-tu essayé d'utiliser le module Win32:rocess pour lancer tes commandes système ?
    Non, j'ai bien vu quelques exemples intéressants sur le forum, mais à ce jour je n'en ai pas eu l'utilité.
    Le seul programme que je lance avec system() c'est Balabolka.exe et ça fonctionne parfaitement, c'est lorsque je faisais un sleep() entre deux textes que je me retrouvais avec le pb

    @+

  5. #5
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    septembre 2011
    Messages
    1 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : septembre 2011
    Messages : 1 376
    Points : 2 023
    Points
    2 023
    Par défaut
    Correction :

    Je me sers de Win32::Process::List et Win32::Process pour lister et tuer des proccess
    Je me sers aussi de Win32::API pour modifier les paramètres de veille du PC lorsque je lance certains programmes Perl avec ou sans Tk
    Je me sers aussi de Win32::API pour passer d'un clavier français à un clavier arabe dans un programme Perl/Tk
    Et donc maintenant pour effacer la barre des tâches et les icônes du bureau

    C'est 4 fonctionnalités sont OK tant en Win7 que Win8.1 ce dont je doutais à la vue des commentaires en recherchant les paramètres des API.
    En XP je n'ai pas de Perl d'installé.

    Je suis encore en Perl v5.12.4 j'ai essayé la 18 mais j'avais des pb de modules et pas le temps de m'y attarder.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Swing] Modifier menu barre des tâches
    Par snyfir dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 29/05/2012, 15h47
  2. [AC-97] menu déroulant barre des tâches
    Par apprentiing dans le forum IHM
    Réponses: 2
    Dernier message: 04/02/2011, 08h50
  3. Menu démarrer et barre des tâches qui se bloquent
    Par olgicka dans le forum Windows XP
    Réponses: 8
    Dernier message: 06/02/2010, 10h15
  4. Comment masquer le MessageBox de la barre des tâches ?
    Par Coussati dans le forum Langage
    Réponses: 7
    Dernier message: 25/08/2003, 14h33
  5. HAUTEUR de la barre des tâches de Windows ?
    Par Lung dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 13/12/2002, 11h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo