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 :
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: