Page 1 sur 2
[R] Question handle et window
Posté : jeu. 04 déc. 2014 09:29
par DimVar
Bonjour,
Dans l'attente d'une réponse sur
ce sujet, je teste des fonctions sur les handle window et autres.
J'ai donc tenté de récupérer un handle ou une class d'une fenetre ouverte : Firefox.
Code : Tout sélectionner
#include <Array.au3>
$aWinList=WinList()
_ArrayDisplay($aWinList)
$h=WinGetClassList ("0x000E0018")
MsgBox (0,@error,$h)
Je liste les fenetres avec Winlist, je les display avec arraydisplay. Je recupere visuellement le handle d'un onglet firefox, et le mets à la main dans wingetclasslist.
Ceci dans le but de recuperer la class de firefox, pour pouvoir m'en servir par la suite comme parametre à d'uatre fonctions (puisque le param TITLE ne fonctionne pas toujours).
Et paf, $h est vide...
Qu'est ce que je ne comprends pas ?
Merci.
Re: [..] Question handle et window
Posté : jeu. 04 déc. 2014 09:39
par A2Energie
Bonjour,
Ton problème vient clairement de "0x000E0018"
Car en testant
cela fonctionne.
Re: [..] Question handle et window
Posté : jeu. 04 déc. 2014 10:11
par jguinch
Pour Firefox, il y a l'
UDF Firefox.
Perso, je n'utilise que IE pour ce qui est de l'automatisation
Re: [..] Question handle et window
Posté : jeu. 04 déc. 2014 10:39
par DimVar
A2Energie a écrit :Bonjour,
Ton problème vient clairement de "0x000E0018"
Car en testant
cela fonctionne.
Quand j'utilise ton parametre, voila le resultat du consolewrite :
► Afficher le texte
Code : Tout sélectionner
SciTEWindowContent
Scintilla
Scintilla
ToolbarWindow32
SciTeTabCtrl
SciTEWindowContent
SciTEWindowContent
Static
msctls_progress32
SciTEWindowContent
Static
Edit
Button
SciTEWindowContent
Static
ComboBox
Edit
Button
Button
Button
Button
Button
Button
Button
Button
SciTEWindowContent
Static
ComboBox
Edit
Static
ComboBox
Edit
Button
Button
Button
Button
Button
Button
Button
Button
Button
msctls_statusbar32
Je n'y vois pas de Firefox....
Re: [..] Question handle et window
Posté : jeu. 04 déc. 2014 10:42
par DimVar
jguinch a écrit :Pour Firefox, il y a l'
UDF Firefox.
Perso, je n'utilise que IE pour ce qui est de l'automatisation
Oui, j'ai tenté d'y jeter un oeil mais j'ai beaucoup de lacunes sur la gestion des fenetres, GUI, et autres handles...
Raison de mon topic dans "demande de script".
Je cherche à switcher l'affichage des onglets.
Re: [..] Question handle et window
Posté : jeu. 04 déc. 2014 10:55
par A2Energie
Ah tu cherche à switch les onglets.
Pour ma part, je n'ai jamais réussi, hormis avec des commandes clavier.
Le problème est que seul la fenêtre principale est reconnu, les onglets... non.
Je pense qu'il faut regarder du côté du msdn de microsoft pour IE. ca doit être peut être gérable, et encore
par contre sur firfox... je pense que c'est limite impossible.
Pour info, tu as autoit windows info qui est une petit programme très util pour retrouver les class et autres infos des fenêtres. Je te conseil de l'utiliser tu verras c'est magique.
Re: [..] Question handle et window
Posté : jeu. 04 déc. 2014 11:09
par DimVar
Merci pour le Winfo (que je connais) mais le but etait de ne pas l'utiliser et de passer par un script.
Re: [..] Question handle et window
Posté : jeu. 04 déc. 2014 11:55
par DimVar
En attendant, je vais passer par du Send. (ctrl + tab)
Comment , par le script, m'assurer que la fenetre FF ou IE est bien au 1er plan, pour etre sur que le send ne va pas etre envoyé sur une autre fenetre...?
Merci.
Re: [..] Question handle et window
Posté : jeu. 04 déc. 2014 13:54
par TommyDDR
Juste pour info :
Ne peut pas fonctionner car "0x000E0018" est un string et non un handle, essayez plutôt :
Je suppose que "0x000E0018" n'est qu'un test (Rappel : le handle est attribué dinamiquement à la création de la fenêtre. Donc si vous fermez, relancez le programme, le handle changera)
Re: [..] Question handle et window
Posté : jeu. 04 déc. 2014 14:24
par walkson
Bonjour,
Sauf erreur de ma part, avec process (ProcessList ou ProcessExists) on obtient un PID que l'on peut traduire en handle. Cela devrait permettre de récupérer le Handle de Firefox
[Edit] j'ai retrouve le script:
► Afficher le texte
Code : Tout sélectionner
Local $aPID
$aPID = ProcessExists("Firefox.exe")
$handle = _GetHwndFromPID($aPID)
MsgBox(0,"11",$handle)
MsgBox(0,"22",$aPID)
MsgBox(0,"33",WinGetTitle($handle))
Func _GetHwndFromPID($PID)
$hWnd = 0
$stPID = DllStructCreate("int")
Do
$winlist2 = WinList()
For $i = 1 To $winlist2[0][0]
If $winlist2[$i][0] <> "" Then
DllCall("user32.dll", "int", "GetWindowThreadProcessId", "hwnd", $winlist2[$i][1], "ptr", DllStructGetPtr($stPID))
If DllStructGetData($stPID, 1) = $PID Then
$hWnd = $winlist2[$i][1]
ExitLoop
EndIf
EndIf
Next
Sleep(100)
Until $hWnd <> 0
Return $hWnd
EndFunc ;==>_GetHwndFromPID
[Edit 2] ce script n'est pas de moi mais d'un illustre scripteur de ce forum...
Re: [..] Question handle et window
Posté : jeu. 04 déc. 2014 14:48
par jguinch
► Afficher le texte
Code : Tout sélectionner
$hFirefox = WinGetHandle("[REGEXPTITLE:(?i)Mozilla Firefox$]")
$sActiveTab = WinGetTitle($hFirefox) ; Titre de l'onglet actif
WinActivate($hFirefox)
ControlSend($hFirefox, "", "", "^{TAB}") ; Active l'onglet suivant
$sActiveTab = WinGetTitle($hFirefox) ; Titre de l'onglet actif
ControlSend($hFirefox, "", "", "^1") ; Passe à l'onglet suivant
$sActiveTab = WinGetTitle($hFirefox) ; Titre du premier onglet
Re: [..] Question handle et window
Posté : jeu. 04 déc. 2014 14:53
par DimVar
walkson a écrit :... (ProcessList ou ProcessExists) on obtient un PID que l'on peut traduire en handle...
Bien vu pour l'astuce, je la note.
TommyDDR a écrit :Juste pour info :
Ne peut pas fonctionner car "0x000E0018" est un string et non un handle, essayez plutôt :
String car elle est entre double quote ? Dans ce cas, cette commande devrait fonctionner, hors elle ne fonctionne pas :
TommyDDR a écrit :Je suppose que "0x000E0018" n'est qu'un test (Rappel : le handle est attribué dynamiquement à la création de la fenêtre. Donc si vous fermez, relancez le programme, le handle changera)
"0x000E0018" n'est que le retour d un winlist. Et d'apres la doc de cette function (WinGetClassList) : title, hWnd et class sont des valeurs possibles pour le 1er param. C'est la raison pour laquelle j'ai mis cette valeur.
Merci.
Re: [..] Question handle et window
Posté : jeu. 04 déc. 2014 15:24
par jguinch
DimVar : ce que Tommy veut dire, c'est que d'un part, un Handle de fenêtre change à chaque fois que tu lances l'application. D'autre part la syntaxe ne nécessite pas de double quotes (car c'est une valeur numérique qui est attendue).
Re: [..] Question handle et window
Posté : jeu. 04 déc. 2014 16:21
par DimVar
jguinch a écrit :DimVar : ce que Tommy veut dire, c'est que d'un part, un Handle de fenêtre change à chaque fois que tu lances l'application...
Oui oui, j'avais saisi
jguinch a écrit :► Afficher le texte
Code : Tout sélectionner
$hFirefox = WinGetHandle("[REGEXPTITLE:(?i)Mozilla Firefox$]")
$sActiveTab = WinGetTitle($hFirefox) ; Titre de l'onglet actif
WinActivate($hFirefox)
ControlSend($hFirefox, "", "", "^{TAB}") ; Active l'onglet suivant
$sActiveTab = WinGetTitle($hFirefox) ; Titre de l'onglet actif
ControlSend($hFirefox, "", "", "^1") ; Passe à l'onglet suivant
$sActiveTab = WinGetTitle($hFirefox) ; Titre du premier onglet
Mais c'est parfait ca ! Tu peux m'en dire plus sur cette valeur : [REGEXPTITLE:(?i)Mozilla Firefox$]
C'est quoi ce charabia ? On peut faire du regex dans un title ? Pourquoi alors cette commande ne renvoi rien : WinGetHandle("Mozilla Firefox")
Merci
Re: [..] Question handle et window
Posté : jeu. 04 déc. 2014 18:07
par jguinch
Ca ne marche pas avec "Mozilla Firefox" car par défaut, la recherche se fait en mode 1 :
Matches partial titles from the start.
Tu peux essayer le mode 2 avec
Opt("WinTitleMatchMode", 2), là ça marchera.
Moi j'avais utilisé
["REGEXPTITLE:(?i)Mozilla Firefox$"] pour
fenêtre dont le titre finit par Mozilla Firefox
Pour plus d'infos, voir l'aide dans la rubrique
Using Autoit / Window Titles and Text (Advanced).
Re: [..] Question handle et window
Posté : jeu. 04 déc. 2014 18:23
par mikell
Gné
Code : Tout sélectionner
Opt("WinTitleMatchMode", -2)
$h = WinGetClassList ("firefox")
MsgBox (0,@error, $h)
$k = WinGetClassList (WinGetHandle("firefox"))
MsgBox (0,@error, $k)
Re: [..] Question handle et window
Posté : jeu. 04 déc. 2014 22:49
par TommyDDR
Il me semble que même la forme 0x12345678 ne fonctionne pas, il faut vraiment utiliser Hwnd(0x12345678)
Re: [..] Question handle et window
Posté : jeu. 04 déc. 2014 23:36
par jguinch
Merci Mikell (de me foutre la honte)
Dans tous les cas, aucun contrôle ne sera retourné pour Firefox... C'est bien ça le problème
Re: [..] Question handle et window
Posté : ven. 05 déc. 2014 08:57
par DimVar
jguinch a écrit :Ca ne marche pas avec "Mozilla Firefox" car par défaut, la recherche se fait en mode 1 :
Matches partial titles from the start.
Tu peux essayer le mode 2 avec
Opt("WinTitleMatchMode", 2), là ça marchera.
Moi j'avais utilisé
["REGEXPTITLE:(?i)Mozilla Firefox$"] pour
fenêtre dont le titre finit par Mozilla Firefox
Pour plus d'infos, voir l'aide dans la rubrique
Using Autoit / Window Titles and Text (Advanced).
Géniale cette page d'aide ! J'ai compris les 3/4 de mes erreurs sur la gestion des fenetres, merci !
Re: [..] Question handle et window
Posté : ven. 05 déc. 2014 08:59
par DimVar
TommyDDR a écrit :Il me semble que même la forme 0x12345678 ne fonctionne pas, il faut vraiment utiliser Hwnd(0x12345678)
Merci, c'est noté.