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

Aide sur les Interfaces Graphique Utilisateurs (GUI).
Règles du forum
.
Répondre
hilow
Niveau 2
Niveau 2
Messages : 28
Enregistré le : jeu. 05 avr. 2012 10:07
Localisation : 78/28
Status : Hors ligne

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

#1

Message 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 ?
Modifié en dernier par hilow le ven. 20 avr. 2012 14:14, modifié 1 fois.
Avatar du membre
blacksoul305
Membre émérite
Membre émérite
Messages : 957
Enregistré le : ven. 18 mars 2011 11:49
Localisation : Au pays des programmeurs.
Status : Hors ligne

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

#2

Message 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
Étudiant en 2ème année de Licence Informatique.
hilow
Niveau 2
Niveau 2
Messages : 28
Enregistré le : jeu. 05 avr. 2012 10:07
Localisation : 78/28
Status : Hors ligne

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

#3

Message 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:
Avatar du membre
blacksoul305
Membre émérite
Membre émérite
Messages : 957
Enregistré le : ven. 18 mars 2011 11:49
Localisation : Au pays des programmeurs.
Status : Hors ligne

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

#4

Message 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
Modifié en dernier par blacksoul305 le ven. 20 avr. 2012 17:46, modifié 1 fois.
Étudiant en 2ème année de Licence Informatique.
hilow
Niveau 2
Niveau 2
Messages : 28
Enregistré le : jeu. 05 avr. 2012 10:07
Localisation : 78/28
Status : Hors ligne

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

#5

Message 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).
Avatar du membre
blacksoul305
Membre émérite
Membre émérite
Messages : 957
Enregistré le : ven. 18 mars 2011 11:49
Localisation : Au pays des programmeurs.
Status : Hors ligne

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

#6

Message 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 !
Étudiant en 2ème année de Licence Informatique.
hilow
Niveau 2
Niveau 2
Messages : 28
Enregistré le : jeu. 05 avr. 2012 10:07
Localisation : 78/28
Status : Hors ligne

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

#7

Message 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.
Répondre