XL 2010 En vba comment avoir "la main" sur une fenêtre externe comme une appli

tarvel

XLDnaute Occasionnel
J'utilise une macro pour piloter une page web ayant une grille à 10 chiffres pour valider un mot de passe.
1 je lance en vba la page web
2 je fais une capture d'ecran comportant la grille avec
keybd_event VK_MENU, 0, 0, 0
keybd_event VK_SNAPSHOT, 0, 0, 0
keybd_event VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0
keybd_event VK_MENU, 0, KEYEVENTF_KEYUP, 0
3 J'ouvre l'appli paint pour enregistrer en image la capture d'écran : les sendkeys fonctionnent correctement et :
Dim hwnd As Long
hwnd = FindWindow(vbNullString, "Capture.jpg - Paint") etc...

4 je lance l'appli de finereader ABBYY Hot folder (dans lequel j'ai défini au préalable une zone de la grille à 10 chiffres) à Reconnaissance de caractère (OCR)
MyAppID = Shell("C:\Program Files (x86)\ABBYY FineReader 10\HotFolder.exe", vbNormalFocus).mon appli se lance bien...
AppActivate "ABBYY Hot Folder" ne semble pas fonctionner...un SendKeys "~", True...etc... rien ne se passe sur l'appli!
J'aimerais utiliser le clic souris sur cette fenêtre application...mais comment faire?

Par contre pour fermer l'appli j'utilise ce code qui fonctionne bien:
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & StrComputer & "\root\cimv2")
et non cette ligne suivante sous 64bits windows 7
'Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\" & StrComputer & "rootcimv2")
Set colProcessList = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = 'HotFolder.exe'")
For Each objProcess In colProcessList
objProcess.Terminate
Next

5 j'enregistre le résultat sous classeur excel
6 J'utilise la grille pour valider le mot de passe et l'IDentifiant pour entrer enfin dans mon back office

Le problème est au niveau 4 lorsque je lance l'appli...je n'arrive pas à avoir le focus (en utilisant un sendkeys ou clic de souris sur cette fenêtre appli active) et ainsi lancer le traitement
Je suis sur Excel 2010 sous windows seven 64bits
Merci pour votre aide
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Essayez peut être en ajoutant l'instruction DoEvents derrière AppActivate.
Il est en effet très probable que l'activation effective soit sinon exécutée en arrière plan, quand la macro aura terminé sa propre exécution, ce qui sera trop tard.
Je ne garantis pas que ça suffira.
 

tarvel

XLDnaute Occasionnel
Merci pour ton aide Dranreb ; bon j'avance un peu :
Dim dem
dem = Shell("C:\Program Files (x86)\ABBYY FineReader 10\HotFolder.exe", vbNormalFocus)
' On Error Resume Next
Dim PauseTime, Start
PauseTime = 0.01
Start = Timer
Do While Timer < Start + PauseTime
DoEvents
Loop
AppActivate ("ABBYY Hot Folder")
SendKeys "D"
SendKeys "{ENTER}", True
PauseTime = 2
Start = Timer
Do While Timer < Start + PauseTime
DoEvents
Loop
Mais sur la ligne de code : AppActivate ("ABBYY Hot Folder")
J'ai une erreur execution 5
Argument ou appel de procédure incorrect..???
Donc j'ai placé avant : on error resume next...Et ça a l'air de bien prendre en compte les sendkeys en continuant malgré l'erreur!!!!
 

Dranreb

XLDnaute Barbatruc
La liste de paramètres ne doit pas être spécifiée entre parenthèses, sauf pour une Function, ou si Call est spécifié devant.
C'est pourquoi il ajoute un espace devant, supposant que la parenthèse, nullement interprétée de toute façon comme délimiteur de la liste de paramètres, est liée un besoin de changement de priorité des opérateurs éventuels dans l'expression représentant le 1er paramètre. Mais ça n'explique pas trop, en soit, l'erreur…

C'est plutôt derrière AppActivate que je voyais un DoEvent peut être nécessaire.
Sinon les SendKeys risquent toujours, il me semble, d'être récupérés encore dans Excel…
 
Dernière édition:

tarvel

XLDnaute Occasionnel
Merci pour tes précisions Dranreb...malgré tout...les sendkeys fonctionnent sur l'appli avec ce On error...pour l'instant je m'en contente...
Je continue la macro...je suis en phase 6 où je dois placer le mot de passe en fonction des placements des chiffres dans la grille...la grille que je réussi à scanner grâce à l'OCR de l'appli finereader ABBYY Hot folder...enregistrée sur uéeer...
 

Dranreb

XLDnaute Barbatruc
Pourquoi n'utilisez vous pas la ProcId pour être sûr de ne pas vous tromper dans le titre exact de la fenêtre ?
VB:
Dim ProcId As Integer
ProcId = Shell("C:\Program Files (x86)\ABBYY FineReader 10\HotFolder.exe", vbNormalFocus)
…
AppActivate ProcId