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

VBA Discussion :

Mettre une fenêtre réduite au premier plan


Sujet :

VBA

  1. #1
    Membre habitué Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 367
    Points : 191
    Points
    191
    Par défaut Mettre une fenêtre réduite au premier plan
    Bonjour

    Je cherche un moyen de mettre une fenêtre au premier plan. J'ai un script qui pilote firefox via des sendkeys (pour ceux qui ont suivi, j'ai abandonné l'idée mozrepl, c'est pas assez stable, 9 fois sur 10, la connexion plante quand j'envoie une commande un peu complexe (genre un
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    while (condition) { commande(); }
    )

    Donc au final, j'ai trouvé une solution pas top, à savoir, je bloque le clavier et la souris, j'envoie un sendkey, j'attends 500ms, je vérifie si la fenêtre a changé de titre ou si ma popup est arrivée, sinon je renvoie le sendkey.... le tout pendant 15 secondes, jusqu'à ce que la commande soit arrivée à destination...

    Malheureusement, la fenêtre dans laquelle je dois envoyer les sendkeys n'est pas forcément au premier plan, et si la fenêtre est minimisée, j'envoie mes commandes dans le vide. Je sais mettre la fenêtre au premier plan avec SetForegroundWindow (qui est mieux que BringWindowToTop, parce qu'en plus de la mettre à l'avant plan, il lui donne aussi le focus)

    Je peux aussi remonter la fenêtre de la barre des tâches avec un SendMessage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
                                                                           ByVal wParam As Long, lParam As Any) As Long
     
    Public Const WM_SYSCOMMAND As Long = &H112&
    Public Const SC_MAXIMIZE As Long = &HF030&
     
    '...
    Call SendMessage(app_hWnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0)
    '...
    mais la commande SC_MAXIMIZE agrandit la fenêtre (comme le bouton à gauche de la croix), et ce n'est pas le comportement que j'attends. En regardant un peu dans la doc MSDN, j'ai trouvé SC_RESTORE, mais il ne remet pas la fenêtre au premier plan si elle est dans la barre des tâches.

    Comment sortir une fenêtre de la barre des tâches sans l'agrandir ?

    Oh et j'ai également tenté ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Declare  Function ShowWindow Lib "user32" _
        (ByVal lHwnd As Long, _
        ByVal lCmdShow As Long) As Boolean
     
    Public Const SW_HIDE As Long = 0
    Public Const SW_SHOW As Long = 5
    Public Const SW_MINIMIZE As Long = 2
    Public Const SW_MAXIMIZE As Long = 3
     
    ...
    Call ShowWindow (app_hWnd, SW_SHOW)
    ...
    mais la fenêtre ne passe pas non plus au premier plan

  2. #2
    Membre habitué Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 367
    Points : 191
    Points
    191
    Par défaut
    J'ai trouvé une solution avec ShowWindow et SetForegroundWindow

    SetForegroundWindow met la fenêtre au premier plan
    ShowWindow la relève si elle est cachée (il peut faire d'autres trucs, mais là c'est ce qui m'intéresse)

    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
    Private Declare Function SetForegroundWindow Lib "user32" (ByVal HWND As Long) As Boolean
    Private Declare Function ShowWindow Lib "user32" (ByVal HWND As Long, ByVal nCmdShow As Integer) As Boolean
     
    Private Const SW_HIDE As Long = 0
    Private Const SW_MAXIMIZE As Long = 3
    Private Const SW_MINIMIZE As Long = 6
    Private Const SW_RESTORE As Long = 9
    Private Const SW_SHOW As Long = 5
    Private Const SW_SHOWDEFAULT As Long = 10
    Private Const SW_SHOWMAXIMIZED As Long = 3
    Private Const SW_SHOWMINIMIZED As Long = 2
    Private Const SW_SHOWMINNOACTIVE As Long = 7
    Private Const SW_SHOWNA As Long = 8
    Private Const SW_SHOWNOACTIVATE As Long = 4
    Private Const SW_SHOWNORMAL As Long = 1
     
    Sub MyBringWindowToTop(ByVal app_hWnd)
     
        Call SetForegroundWindow(app_hWnd)
        Call ShowWindow(app_hWnd, SW_RESTORE)
     
    End Sub
    Usage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyBringWindowToTop(WindowHandle)
    J'ai pas fait de contrôle, parce que dans mon cas, je suis assuré que le handle existe et qu'il correspond à une fenêtre non cachée, donc il n'y a pas de raison qu'elle ne puisse pas être réveillée

    Un truc un peu plus correct serait

    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
    Private Declare Function SetForegroundWindow Lib "user32" (ByVal HWND As Long) As Boolean
    Private Declare Function ShowWindow Lib "user32" (ByVal HWND As Long, ByVal nCmdShow As Integer) As Boolean
     
    Private Const SW_HIDE As Long = 0
    Private Const SW_MAXIMIZE As Long = 3
    Private Const SW_MINIMIZE As Long = 6
    Private Const SW_RESTORE As Long = 9
    Private Const SW_SHOW As Long = 5
    Private Const SW_SHOWDEFAULT As Long = 10
    Private Const SW_SHOWMAXIMIZED As Long = 3
    Private Const SW_SHOWMINIMIZED As Long = 2
    Private Const SW_SHOWMINNOACTIVE As Long = 7
    Private Const SW_SHOWNA As Long = 8
    Private Const SW_SHOWNOACTIVATE As Long = 4
    Private Const SW_SHOWNORMAL As Long = 1
     
    Public Sub MyBringWindowToTop(ByVal app_hWnd)
     
        If Not SetForegroundWindow(app_hWnd) Then Err.Raise (Err.LastDllError, "Impossible de mettre la fenêtre au premier plan. Code d'erreur : " & Err.LastDllError)
        If Not ShowWindow(app_hWnd, SW_RESTORE) Then Err.Raise (Err.LastDllError, "Impossible de mettre la fenêtre au premier plan. Code d'erreur : " & Err.LastDllError)
     
    End Sub

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

Discussions similaires

  1. Mettre une fenêtre popup au premier plan quand on clique sur le lien
    Par metabaron81 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 28/03/2011, 16h58
  2. Mettre une fenetre toujours au premier plan
    Par blondelle dans le forum C++Builder
    Réponses: 26
    Dernier message: 14/01/2009, 11h46
  3. Mettre une application Access au premier plan
    Par funkyjul dans le forum VBA Access
    Réponses: 6
    Dernier message: 20/05/2008, 15h58
  4. Forcer une fenêtre à rester en premier plan
    Par ValyGator dans le forum Windows
    Réponses: 2
    Dernier message: 20/01/2008, 11h11
  5. Réponses: 12
    Dernier message: 05/09/2007, 14h46

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