Page 1 sur 1

[R] ControlGetPos() sur un IE embarqué me retourne @error

Posté : ven. 20 avr. 2012 12:55
par hilow
Bonjour,

Comme dit dans le titre, ControlGetPos() ne semble pas vouloir me donner les coordonnées d'un navigateur incorporé, tandis que ça fonctionne bien pour un autre contrôle ;s

Alors, j'ai déjà vu ce type de comportement avec un IE en OCX sous VB6 et il fallait préalablement naviguer quelque part (n'importe où) pour que l'objet WebBrowser existe vraiment, mais là, ça ne marche pas non plus (cf. la ligne de navigation commentée).

Voici mon code test :

Code : Tout sélectionner

#include <GUIConstants.au3>
#include <Array.au3>
#include <IE.au3>

$ui = GUICreate("wb position", 600, 500)
$cmd = GUICtrlCreateButton("check wb position", 10, 10, 200, 25)
$wb = _IECreateEmbedded()
GUICtrlCreateObj($wb, 10, 40, 580, 450)
GUISetState()

;~ _IENavigate($wb, "http://google.com", 1)

While 1
    Switch GUIGetMsg()
        Case $cmd
            $wb_coords = ControlGetPos($ui, "", $wb)
            If @error Then
                MsgBox(4096, "Error", "Unable to get wb position")
            Else
                _ArrayDisplay($wb_coords)
            EndIf
        Case $gui_EVENT_CLOSE
            Exit(0)
    EndSwitch
WEnd
 
Une idée ?

Re: [..] ControlGetPos() sur un IE embarqué me retourne @err

Posté : ven. 20 avr. 2012 13:03
par blacksoul305
Voici ce que j'ai réussi à faire, sachant que je ne connais rien au IE. C'est peut être bancale, désolé.

Code : Tout sélectionner

#include <GUIConstants.au3>
#include <Array.au3>
#include <IE.au3>

HotKeySet("{ENTER}","_enter")

$ui = GUICreate("wb position", 600, 500)
Global $cmd = GUICtrlCreateButton("check wb position", 10, 10, 200, 25)
$wb = _IECreateEmbedded()
GUICtrlCreateObj($wb, 10, 40, 580, 450)
GUISetState()

_IENavigate($wb, "http://google.com", 1)

While 1
    Switch GUIGetMsg()
        Case $cmd
            $wb_coords = ControlGetPos("wb position", "", $ui)
            If @error Then
                MsgBox(4096, "Error", "Unable to get wb position")
            Else
                _ArrayDisplay($wb_coords)
                MsgBox(0,"oops","ça marche")
            EndIf
        Case $gui_EVENT_CLOSE
            Exit(0)
    EndSwitch
WEnd

Func _enter()
    ControlClick("wb position","",$cmd)
EndFunc

Re: [..] ControlGetPos() sur un IE embarqué me retourne @err

Posté : ven. 20 avr. 2012 13:35
par hilow
Merci, mais là tu ne récupères pas la position du IE embarqué avec :

Code : Tout sélectionner

$wb_coords = ControlGetPos("wb position", "", $ui)
Aussi, je ne vois pas l'intérêt de la HotKey pour indirectement aller cliquer sur le bouton. Mais j'ai peut-être loupé une ruse de ta part :roll:

Re: [..] ControlGetPos() sur un IE embarqué me retourne @err

Posté : ven. 20 avr. 2012 13:46
par blacksoul305
En fait j'ai récupéré ton code et ait touché un peu à tout (désolé) :)

Je vais me renseigner sur les commandes IE de mon côté !

EDIT : Bah je récupère quoi alors ?

EDIT2 : Je pense avoir trouvé :

Code : Tout sélectionner

#include <GUIConstants.au3>
#include <Array.au3>
#include <IE.au3>

$ui = GUICreate("wb position", 600, 500)
$cmd = GUICtrlCreateButton("check wb position", 10, 10, 200, 25)
$wb = _IECreateEmbedded()
GUICtrlCreateObj($wb, 10, 40, 580, 450)
GUISetState()

_IENavigate($wb, "http://google.com", 1)

While 1
    Switch GUIGetMsg()
        Case $cmd
            $wb_coords = ControlGetPos($ui, "", "Internet Explorer_Server1") ; ici
            If @error Then
                MsgBox(4096, "Error", "Unable to get wb position")
            Else
                _ArrayDisplay($wb_coords)
                MsgBox(0,"oops","ça marche")
            EndIf
        Case $gui_EVENT_CLOSE
            Exit(0)
    EndSwitch
WEnd

Re: [..] ControlGetPos() sur un IE embarqué me retourne @err

Posté : ven. 20 avr. 2012 13:58
par hilow
Extra, ça marche. De mon côté, j'étais parti à voir autour du handle retourné par GUICtrlCreateObj, plutôt que celui du _IECreateEmbedded, mais sans succès. Ton chemin par ce dernier code est le bon donc :) Merci blacksoul305 !

En y pensant, je me souviens avoir déjà vu ce "Internet Explorer_Server1"... Faut qu'je recherche...

--
EDIT : par contre, ça vérifie aussi l'hypothèse que j'emettais dans mon premier post : il faut naviguer au préalable pour que le browser "existe" (si tu commentes la ligne navigate, ça ne marche plus).

Re: [..] ControlGetPos() sur un IE embarqué me retourne @err

Posté : ven. 20 avr. 2012 14:09
par blacksoul305
Bah j'ai juste lancer le programme et pris l'utilitaire Windows Info.

Oublie pas le sujet en résolu en éditant le premier post !

EDIT: J'avais pas vu ton édit. Bon à propos de ton hypothèse j'ai envie de te dire "sûrement", je me suis jamais penché sur les commandes _IE et je dois dire que c'est avec chance que j'ai trouvé la solution à ton problème !

Re: [..] ControlGetPos() sur un IE embarqué me retourne @err

Posté : ven. 20 avr. 2012 14:14
par hilow
Oui, je vais le passer en résolu, mais le truc me tracassait (on ne se refait pas:)... Alors, j'ai retrouvé où je l'avais déjà vu, ce "Internet Explorer_Server". C'était sur un projet sur lequel j'ai bossé il y a quelques années, en VB6. J'ai retrouvé cette fonction dans ledit code (qui est en VB6 mais peut tout de même expliquer la démarche en AutoIt, par analogie) :

Code : Tout sélectionner

Public Function GetEmbeddedWebBrowserClientRect(hOwner As Long) As RECT
    'Get WebBrowser client area coordinates (stable way)
    'IN : handle to window in which is embedded WebBrowser control
    'OUT : client arect (w/ top/left being 0/0 as usual using GetClientRect() Win API fct
    'NB : work if there is only one WebBrowser
    '     & "Internet Explorer_Server" will be avail only if page loaded in it (eg. about&#058;blank)
    'REQ : Win API support
    Dim sClientRC As RECT
    
    Const strClass1 As String = "Shell Embedding"
    Const strClass2 As String = "Shell DocObject View"
    Const strClass3 As String = "Internet Explorer_Server"
    
    Dim hWnd1 As Long, hWnd2 As Long, hwnd3 As Long
    
    hWnd1 = FindWindowEx(hOwner, 0, strClass1, vbNullString)
    hWnd2 = FindWindowEx(hWnd1, 0, strClass2, vbNullString)
    hwnd3 = FindWindowEx(hWnd2, 0, strClass3, vbNullString)
    GetClientRect hwnd3, sClientRC 'non-relative coord (left:0,top:0,right:width,bottom:height)
   
    GetEmbeddedWebBrowserClientRect = sClientRC
End Function
Bon, je lève le flag [R] de ce pas :)

PS : et j'ai testé une simple navigation préalable de type _IENavigate($wb, "about:blank", 1) et ça semble lui suffire.