XL 2016 Impossible de SendKeys une tabulation

R1-

XLDnaute Junior
Bonjour,

Toujours dans mes problèmes de SendKeys, je fais face à un problème tout à fait obscur. Pour contrôler un logiciel sur mon bureau Windows, j'effectue de multiples SendKeys pour saisir du texte, cela fonctionne très bien. Cependant, dès que j'essaie d'envoyer des touches comme {TAB} ou {ENTER}, rien ne se passe sur le logiciel que je cherche à automatiser. Étrangement, lorsque je teste ces commandes sur le bloc-notes ou sur Excel, cela fonctionne très bien. J'ai effectué quelques recherches et je suis tombé sur des personnes ayant le même problème, malheureusement sans réponse. J'ai testé via l'application et via le shell, mais rien n'y fait. Je suis donc preneur de votre aide si vous avez déjà fait face à ce problème.

Voici le code, pour un peu plus de contexte :

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
   
    Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
    (ByVal hWndParent As LongPtr, ByVal hWndChildAfter As LongPtr, ByVal lpszClass As String, ByVal lpszWindow As String) As LongPtr

    Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hWnd As LongPtr) As LongPtr
    Private Declare PtrSafe Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

    Private Const KEYEVENTF_KEYUP As Long = &H2
    Private Const VK_TAB As Byte = &H9

Const GW_HWNDNEXT As Long = 2

Sub ObtenirNomsFenetres()
    Dim hWnd As LongPtr
    Dim windowTitle As String
    Dim windowTextLength As Long
    Dim windowHandle As LongPtr
    Dim ie As Object
    Dim url As String
    Dim shell As Object
    Set shell = CreateObject("WScript.Shell")
   
    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)
           
            If InStr(1, windowTitle, "Edit Shipment", vbTextCompare) > 0 Then
           
                windowHandle = FindWindowEx(0, 0, vbNullString, windowTitle)
                If windowHandle <> 0 Then
   
                    SetForegroundWindow windowHandle
                Else
                    MsgBox "La fenêtre n'a pas été trouvée.", vbExclamation
                End If
           
            End If
           
        End If
        hWnd = GetWindow(hWnd, GW_HWNDNEXT)
    Loop
   
    
'test d'une saisie de texte
    Application.SendKeys ("SEA")
    Application.Wait Now + TimeValue("0:00:02")
'test de toutes les manières que je connaisse pour envoyer un "TAB"
    shell.SendKeys "{TAB}"
    Application.SendKeys "{TAB}"
    keybd_event VK_TAB, 0, 0, 0
    keybd_event VK_TAB, 0, KEYEVENTF_KEYUP, 0
   
End Sub
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Bonjour
juste en passant
je pense que dans la manip des api on ne peut faire pire
ensuite tu utilise shell comme variable pour l'object wscript.shell alors qu'il est intégré dans vba
ensuite tu mélange les ;
  1. application.sendkeys(qui tape dans la fenêtre de l'application ou une de ces descendante active)
  2. shell.sendkeys(qui elle vont taper dans la fenêtre active même si ce n'est pas l'application excel)
  3. et ensuite tu essaie de passer par keybd_event

ensuite tu veux taper dans un child de ta fenêtre et tu met en avant la fenêtre mère
enfin tout tu moins la manœuvre est obscure là

et pour finir SetForegroundWindow n'est pas compatible avec des éléments de type input dans une fenêtre mère car elle met en avant la mère du handle de l'input en paramètre

je te suggère donc
de prendre un peu de courage et de t’intéresser a Uiautomationclient (librairie disponible dans VBA EXCEL)

et peut être même que t’intéresser a l'api sendmessage de la user32 pourra t'éclairer
 

R1-

XLDnaute Junior
Bonjour,

Merci pour ton retour, je vais m'intéresser à Uiautomationclient.

Concernant la fin du code, il s'agit plus de tests que de faire quelque chose qui fonctionne vraiment bien. En fait, ce que je ne comprends pas, c'est que toutes ces méthodes fonctionnent pour insérer du texte, mais pas pour envoyer des contrôles tels que "ENTER", "TAB", etc.

En ce qui concerne la différence entre "application.sendkeys" et "shell.sendkeys", ils semblent se comporter de la même façon, même si l'un passe par le Shell et l'autre par Excel. J'arrive à taper du texte avec "application.sendkeys" dans ma barre de recherche Google, par exemple, ce que je pensais impossible ceci dit en passant.

Quant au "set foreground", je me contente juste de mettre en avant la fenêtre principale. À l'activation de la fenêtre, le curseur se trouve toujours dans le premier champ de la page. Le nom de la page est "edit shipment", ce n'est pas le nom d'un input, d'où probablement la confusion.

En fait, tout le code marche parfaitement, sauf ce satané {TAB}.

Je vais donc explorer les deux méthodes que tu m'as données et voir si cela peut résoudre mon problème.

Merci pour ton aide.

EDIT : je suis en train de plonger dans Uiautomationclient, cette bibliothèque est sur le point de changer ma vie à jamais.
 
Dernière édition:

R1-

XLDnaute Junior
Top, ça m'a permit de découvrir plein de choses, bon après mon logiciel tourne sur citrix workspace, donc c'est raté pour l'utilisation de UIAutomationClient, je vais donc partir sur de l'OCR en VBA (c'est une blague, je vais retourner à mes bon vieux sendkeys 😓).
 

Discussions similaires

Statistiques des forums

Discussions
313 224
Messages
2 096 338
Membres
106 572
dernier inscrit
JM04082023!