XL 2016 Comment obtenir le nom d'une fenêtre windows

R1-

XLDnaute Junior
Bonjour,

Dans le but d'automatiser un processus de saisie, j'utilise une macro VBA. Cependant, cette macro ouvre une sous-fenêtre dans le programme, ce qui fait que je perds le focus de la première fenêtre.
J'ai une méthode pour ramener une fenêtre au premier plan, mais elle nécessite le nom de la fenêtre en question. Le problème est que ce nom est variable, ce qui signifie que je dois récupérer les noms de toutes les fenêtres ouvertes sur le bureau afin de trouver celle qui m'intéresse pour la ramener au premier plan.

Ps : vous aviez déjà remarqué que les "sendkeys" désactivent le pavé numérique, moi non et c'est chiant.

Merci d'avance pour votre aide.

R1-
 
Solution
Bonjour,
Si ces Macro ouvre des sous fenêtres,tu n'as pas besoins de sendkeys,tu as accès à tous les contrôles de la sous fenêtres.
J'ai manqué de précision, elle ouvre une sous fenêtre dans un programme tiers.

Juste pour le second point :

La solution :
topissime, merci pour le tuyaux, je n'avais jamais vraiment fait attention à ce problème de pavé numérique, je viens de percuter qu'aujourd'hui.

Qu'appelez vous une sous fenêtre ? Une feuille XL, un userform, un Msgbox, une autre appli ?
Ou mieux, avez vous un petit fichier test ?
En fait, je m'attaque à l'automatisation de pas mal de processus notamment sur un outil nommé...

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour R1,
Juste pour le second point :
vous aviez déjà remarqué que les "sendkeys" désactivent le pavé numérique, moi non et c'est chiant.
La solution :

Qu'appelez vous une sous fenêtre ? Une feuille XL, un userform, un Msgbox, une autre appli ?
Ou mieux, avez vous un petit fichier test ?
 
Dernière édition:

dysorthographie

XLDnaute Accro
Bonjour,
Si ces Macro ouvre des sous fenêtres,tu n'as pas besoins de sendkeys,tu as accès à tous les contrôles de la sous fenêtres.

Si la sous fenêtres est appelé par Macro alors il est possible de fournir le formulaire appelant au formulaire appelé.

Si les informations doivent être récupérés par le formulaire appelant, alors il faut masque le formulaire appelé et pas le fermer pour que le formulaire appelant récupére les informations.

Mais pour cela il nous faut plus d'informations sur le déroulement de ton procès.
 
Dernière édition:

R1-

XLDnaute Junior
Bonjour,
Si ces Macro ouvre des sous fenêtres,tu n'as pas besoins de sendkeys,tu as accès à tous les contrôles de la sous fenêtres.
J'ai manqué de précision, elle ouvre une sous fenêtre dans un programme tiers.

Juste pour le second point :

La solution :
topissime, merci pour le tuyaux, je n'avais jamais vraiment fait attention à ce problème de pavé numérique, je viens de percuter qu'aujourd'hui.

Qu'appelez vous une sous fenêtre ? Une feuille XL, un userform, un Msgbox, une autre appli ?
Ou mieux, avez vous un petit fichier test ?
En fait, je m'attaque à l'automatisation de pas mal de processus notamment sur un outil nommé Cargowise spécialisé dans la gestion du fret maritime, de la GED et de la facturation. mais je pense que c'est une bataille perdue d'avance, pas d'API facilement appelable à mon niveaux, pas d'outil de scripting comme ceux que l'on pourrait trouver sur SAP, bref obligé d'utiliser une multitude de Send key, ce qui est une technique peu fiable et d'une barbarie sans nom 😅.
Bref pour revenir à mon problème de fenêtre j'ai fini par trouver la solution.

Comme on dit aide toi et le ciel t'aideras, voici donc la réponse à ma propre question (fonctionne en 64bits) :
VB:
Option Explicit

    Declare PtrSafe Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As LongPtr, ByVal lpString As String, ByVal cch As Long) As Long
    Declare PtrSafe Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As LongPtr) As Long
    Declare PtrSafe Function GetWindow Lib "user32" (ByVal hwnd As LongPtr, ByVal wCmd As Long) As LongPtr
    Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr

Const GW_HWNDNEXT As Long = 2

Sub ObtenirNomsFenetres()
    Dim hwnd As LongPtr
    Dim windowTitle As String
    Dim windowTextLength As Long
   
    hwnd = FindWindow(vbNullString, vbNullString)
   
    Do While hwnd <> 0
        windowTextLength = GetWindowTextLength(hwnd)
        If windowTextLength > 0 Then
            windowTitle = Space(windowTextLength + 1)
            GetWindowText hwnd, windowTitle , windowTextLength + 1
            windowTitle = Left(windowTitle, InStr(windowTitle, Chr(0)) - 1)
            MsgBox windowTitle
        End If
        hwnd = GetWindow(hwnd, GW_HWNDNEXT)
    Loop
End Sub
 
Dernière édition: