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

Macros et VBA Excel Discussion :

Probleme activation fenetre reduite d'un autre logiciel windows


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Homme Profil pro
    En reconversion
    Inscrit en
    Mai 2006
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Mai 2006
    Messages : 487
    Par défaut Probleme activation fenetre reduite d'un autre logiciel windows
    Bonjour a tous,

    J'ai un code qui me permet de fermer une fenêtre (si elle est ouverte) d'un logiciel puis d'activer la fenêtre principale de ce même logiciel.
    Le problème est que ça fonctionne mais pas a chaque fois, j'ai l'impression qu'il ne trouve pas la fenêtre a certain moment.

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As Any) As Long    'API pour rechercher le handle d'une fenetre
    Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long    'API pour envoyer une commande a une fenetre avec son Handle
    Public Const WM_CLOSE = &H10
    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
    Application.EnableEvents = True
        Do
     
            FenRun = FindWindow(vbNullString, "fenetre a fermer")
     
            Call PostMessage(FenRun, WM_CLOSE, 0, 0)
     
            DoEvents
        Loop While FenRun <> FindWindow(vbNullString, "Afficher les runs")
      'Sleep 800
     
    Application.ScreenUpdating = True
        On Error GoTo Execute_V10
     
    Application.EnableEvents = False
    Application.ScreenUpdating = False
     
        'AppActivate "fenetre pricipale"
    Call principale_Activate
    et dans un autre module:

    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
    Option Explicit
    Public Declare PtrSafe Function GetDesktopWindow Lib "user32" () As Long
    Public Declare PtrSafe Function GetWindow& Lib "user32" (ByVal hwnd&, ByVal wCmd&)
    Public Declare PtrSafe Function GetWindowLong& Lib "user32" _
    Alias "GetWindowLongA" (ByVal hwnd&, ByVal nIndex&)
    Public Declare PtrSafe Function GetWindowText& Lib "user32" Alias _
    "GetWindowTextA" (ByVal hwnd&, ByVal lpString$, ByVal aint&)
    Private Const mconMAXLEN = 255
     
    Sub principale_Activate()
    Dim hwnd&, Style&, Title$, i&
    hwnd = GetWindow(GetDesktopWindow(), 5)
    Do While hwnd
    Title = GetCaption(hwnd)
    If Len(Title) Then
    ' Enum visible windows only
    If GetWindowLong(hwnd, -16) And &H10000000 Then
    If InStr(1, Title, "cut rite", 1) Then
    AppActivate Title
    Exit Sub
    End If
    End If
    End If
    hwnd = GetWindow(hwnd, 2)
    Loop
    MsgBox "Aucune fenêtre principale trouvée !", 64
    End Sub
     
    Private Function GetCaption(hwnd&) As String
    Dim i%, Buffer$: Buffer = String$(254, 0)
    i = GetWindowText(hwnd, Buffer, 255)
    If i Then GetCaption = Left$(Buffer, i)
    End Function
    Voici le code que j'ai adapté a mes besoins, mais ne connaissant pas le monde des API windows, je suis un peu perdu et je ne comprend pas pourquoi des fois ça fonction et certaines fois je suis obligé d'activer puis désactiver manuellement la fenêtre avant que le code fonctionne.

  2. #2
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Hello,

    Ta boucle d'attente pour fermer ta deuxième fenêtre est peut-être fautive.

    Dans ta boucle tu dit que tant que ta fenêtre, instancie plus haut, n'est pas différente de xxx de continuer.

    Or le nom de la fenêtre à chercher ne change pas

    Tu devrais, fermer la fenêtre, boucler tant qu'elle existe, donner le focus à l'autre.

  3. #3
    Membre éclairé
    Homme Profil pro
    En reconversion
    Inscrit en
    Mai 2006
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Mai 2006
    Messages : 487
    Par défaut
    Merci mfoxy pour ta réponse,

    C'est bien des boucles de la deuxième fenêtre de code que tu parle et non de la troisième?

Discussions similaires

  1. Probleme affichage fenetre fille MDI
    Par freerider74 dans le forum VB.NET
    Réponses: 2
    Dernier message: 16/09/2009, 12h55
  2. Réponses: 4
    Dernier message: 17/12/2008, 15h45
  3. Réponses: 3
    Dernier message: 08/08/2008, 14h05
  4. Affichage de donnée sur une autre fenetre
    Par leroidje dans le forum WinDev
    Réponses: 4
    Dernier message: 12/12/2007, 17h52
  5. Réponses: 17
    Dernier message: 07/02/2007, 15h39

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