Problème bizarre avec PixelGetColor...

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Utilisateur 3309 supprimé
Status : Hors ligne

Problème bizarre avec PixelGetColor...

#1

Message par Utilisateur 3309 supprimé »

bonjour,
je viens de faire évoluer mon petit logiciel qui affiche les infos "cachées" des livebox 3 et 4 d'Orange.
http://liveboxinfo.tk/

Dans les version 1.x j'étais en full Autoit, maintenant afin d'améliorer l'aspect visuel je suis passé en html5/css3 avec Bootstrap/jquery pour l'interface, et autoit pour la programmation. je me suis inspiré de ce script pour déterminer qu'on a appuyé sur un bouton de l'interface web (changement de couleur du bouton = on a appuyé dessus).

J'ai posté mon appli sur le forum orange : http://www.forum-orange.com/viewtopic.p ... 29#p763429
mais visiblement cela ne marche pas pour tout le monde...et je ne comprends pas de quoi cela vient. Chez moi sur 2 PC, avec windows 10 ca marche très bien...On me dit "lorqsue je clique il ne se passe rien". Normalement, une mauvaise IP, un mauvais mot de passe, etc...génère un message d'erreur. Et là ce n'est pas le cas...donc j'imagine que le problème vient de la détection du clic sur le bouton ?
En fait il y a 2 paramètres, la couleur du bouton, et sa position dans l'interface. mais logiquement les 2 doivent être identiques pour tout le monde...

Le code source .au3 de mon programme est fourni avec l'executable : http://liveboxinfo.tk/download/LiveboxInfov2.0.0.zip

Si quelqu'un avec une livebox 3 ou 4 pouvait me faire un retour ?

C'est a partir de ligne 51 que le test du clic sur le bouton commence :

Code : Tout sélectionner

	;Test des couleurs dans la GUI
	$bouton1 = PixelGetColor(40, 290)

	if $bouton1 = 13948116 then ; 13948116 = code couleur RGB décimal du bouton lorsqu'on clique dessus.
		;MsgBox(0,"Bouton","Bouton1 pressé")
		$bouton1 = 0

		; Lecture du formulaire
		Local $oForm = _IEFormGetObjByName($oIE, "loginForm")
		Local $oIp = _IEFormElementGetObjByName($oForm, "ip")
		Local $oPassword = _IEFormElementGetObjByName($oForm, "password")
		$LIVEBOX = _IEFormElementGetValue($oIp)
		$USER = "admin"
		$PASSWORD = _IEFormElementGetValue($oPassword)

		auth_livebox()
		if ($connexion="OK") then
			load_data()

			; insertion des données dans les onglets
			$sHTML = _IEDocReadHTML($oIE) ;Lecture
			$sHTML = StringReplace($sHTML,'DeviceInfotxt',$List4)
			$sHTML = StringReplace($sHTML,'Mibstxt',$List2)
			$sHTML = StringReplace($sHTML,'DSLstatstxt',$List1)
			$sHTML = StringReplace($sHTML,'WANstatustxt',$List3)
			$sHTML = StringReplace($sHTML,'Wifitxt',$List5)
			$sHTML = StringReplace($sHTML,'Servicestxt',$List6)
			$sHTML = StringReplace($sHTML,'Voiptxt',$List7)
			_IEDocWriteHTML($oIE,$sHTML) ; Ecriture
			$connexion=""
		endif
	EndIf
Ce n'est pas impossible que le problème soit ailleurs...Bref merci pour votre aide.
Modifié en dernier par Utilisateur 3309 supprimé le mar. 09 mai 2017 23:21, modifié 2 fois.
Utilisateur 3309 supprimé
Status : Hors ligne

Re: [..] Liveboxinfo 2.0.0 affichage infos cachées livebox

#2

Message par Utilisateur 3309 supprimé »

est-ce qu'il y aurait une autre méthode que PixelGetColor pour détecter que le bouton de l'interface web a été cliqué ??
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: [..] Problème bizarre avec PixelGetColor...

#3

Message par ZDS »

Bonjour,

J'aurais voulu t'aider, mais le script AU3 que tu as fourni dans ton ZIP ne semble pas être utilisable dans un environnement AutoIt de base. Notamment il manque "Json.au3" que tu as eu chez toi la bonne idée de mettre dans ton dossier UDF, mais sans le fournir aux autres ca devient un problème bloquant... ^^ Si tu transmets les sources complètes, je tenterai de t'aider dès demain.

Bonne soirée et à bientôt !
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2272
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Problème bizarre avec PixelGetColor...

#4

Message par jchd »

Bonsoir,

Le problème vient peut-être que la position écran dépend du réglage d'affichage. S'il n'est pas à 100% (125, 150 ou autre) la position est décalée par rapport à une installation "standard".
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Utilisateur 3309 supprimé
Status : Hors ligne

Re: [..] Problème bizarre avec PixelGetColor...

#5

Message par Utilisateur 3309 supprimé »

Bonjour,
merci pour votre aide, j'avais perdu espoir...

@zds
le fichier JSON.au3 est dispo ici : https://www.autoitscript.com/forum/topi ... nt-1286205
un lien google drive est donné

@jchd
OK, je regarde ca.

Sinon pour info, chez moi sur 4 PC différents, cela fonctionne tout le temps, et vu que je n'arrive pas a reproduire le problème rencontré par les utilisateurs, je ne sais plus ou chercher... c'est pourquoi je me demande s'il n'existerait pas une méthode avec une fonction _IE qui permettrai de savoir si le bouton est cliqué ou non, ce serait même d’ailleurs plus "propre" que l'analyse d'un pixel...

Edit:
@jchd
effectivement, je viens de changer l'affichage à 125%, et ca ne marche plus...ca confirme donc que la méthode PixelGetColor n'est pas fiable dans mon projet...

Edit2:
@jchd
On me confirme que c'était la cause du problème ! Oufff !!! sur certains PC visiblement l'affichage recommandé, et par defaut est a 150% ???
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Problème bizarre avec PixelGetColor...

#6

Message par orax »

cetipabo a écrit : mar. 09 mai 2017 09:45c'est pourquoi je me demande s'il n'existerait pas une méthode avec une fonction _IE qui permettrai de savoir si le bouton est cliqué ou non, ce serait même d’ailleurs plus "propre" que l'analyse d'un pixel...
#include <IE.au3>

$oIE = _IECreateEmbedded()
$html_GUI = GUICreate("LiveBoxInfos 2.0.0", 820, 530)
$Browser = GUICtrlCreateObj($oIE, -1, -1, 820, 540)
GUISetState()
_IENavigate($oIE, @scriptdir & "/index.html")

$oButtons = $oIE.document.querySelectorAll('button.btn.btn-sm.btn-default')
For $oButton In $oButtons
   ObjEvent($oButton, "_Evt_")
Next

While 1
    Sleep(100)
WEnd

Func _Evt_onClick()
   ConsoleWrite("Bouton cliqué." & @CRLF)
EndFunc
Mais ça marche mal, le script plante parfois.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Utilisateur 3309 supprimé
Status : Hors ligne

Re: [..] Problème bizarre avec PixelGetColor...

#7

Message par Utilisateur 3309 supprimé »

Merci beaucoup Orax !
chez moi ca semble pourtant bien fonctionner !?
Par contre je ne comprends absolument rien au fonctionnement. et cette fonction Evt_onClick() à la fin, je vois nul part ou elle est utilisée ? et pourtant elle fonctionne...
peux-tu expliquer un peu le mécanisme derrière tout ça ? :D

Edit:
je viens de lire l'explication de ObjEvent, je comprends un peu mieux maintenant.

edit2
après implantation de la methode dans mon script, effectivement ca crash au démarrage 1 fois sur 2...chiotte ! :evil: :evil:
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [R] Problème bizarre avec PixelGetColor...

#8

Message par orax »

Dans la doc, l'exemple 5 de la fonction _IEHeadInsertEventScript fait quelque chose de ressemblant.

_Evt_onClick est la fonction qui interceptera l'évènement click. Voir https://developer.mozilla.org/en-US/docs/Web/Events
Si on crée, par exemple, une fonction _Evt_onmouseenter, celle-ci se déclenchera à chaque fois que la souris passera au dessus du bouton.

querySelectorAll correspond à cette méthode du DOM : https://developer.mozilla.org/fr/docs/W ... electorAll Elle me permet de récupérer le bouton.
Comme je cherchais à récupérer un seul bouton, j'aurais pu utiliser la méthode querySelector (sans le "All"), mais ça ne fonctionnait pas.
Le code suivant aurait été plus simple mais il ne fonctionne pas :

Code : Tout sélectionner

$oButton = $oIE.document.querySelector('button.btn.btn-sm.btn-default')
ObjEvent($oButton, "_Evt_")
Je vais essayer de comprendre pourquoi ça marche une fois sur deux. :?
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Utilisateur 3309 supprimé
Status : Hors ligne

Re: [R] Problème bizarre avec PixelGetColor...

#9

Message par Utilisateur 3309 supprimé »

merci serait cool s'il pouvait y avoir une solution...tu as moyen de debugguer pour comprendre ce qu'il se passe ?
Quand ca ne plante pas, a la fermeture du script on voit qu'il y a de drôles de rafraîchissements d’écran, on dirait que le script continue de "fermer des trucs"...
Utilisateur 3309 supprimé
Status : Hors ligne

Re: [R] Problème bizarre avec PixelGetColor...

#10

Message par Utilisateur 3309 supprimé »

Bonjour,
@orax
j'ai lancé ton exemple de script une dizaine de fois et cliqué autant de fois sur le bouton, ça n'a jamais planté.
Par contre lorsque j'insère le principe dans mon script, la boucle suivante fait quasiment planter tout le temps:

Code : Tout sélectionner

For $oButton In $oButtons
   ObjEvent($oButton, "_Evt_")
Next
Je ne sais pas si tu as eu le temps de regarder ce qu'il se produit ? j'aimerai bien poster la question sur le forum US mais difficile pour moi d'expliquer tout cela...
Utilisateur 3309 supprimé
Status : Hors ligne

Re: [R] Problème bizarre avec PixelGetColor...

#11

Message par Utilisateur 3309 supprimé »

apres quelques heures de modifications, de tests et de recherches, je viens de tomber sur ceci:
https://www.autoitscript.com/trac/autoit/ticket/2865
ce qui nous ramène ici:
https://www.autoitscript.com/forum/topi ... nt-1303644

Je n''ai par contre pas bien compris "la solution" ?!
j'ai essayé l'udf mais il ne se passe rien (mais ca ne plante pas):

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <IE.au3>


$oIE = _IECreateEmbedded()
$html_GUI = GUICreate("test", 820, 530)
$Browser = GUICtrlCreateObj($oIE, -1, -1, 820, 540)

_IENavigate($oIE, @scriptdir & "/index.html")
GUISetState(@SW_SHOW, $html_GUI)

$oDoc = _IEDocGetObj($oIE)
$oButton = _IEquerySelectorAll($oDoc,'button', 0)
ObjEvent($oButton, "_Evt_")


Func _Evt_onClick()
	msgbox(0,"","button clicked")
EndFunc


While 1
	;Fermeture application si on clique sur la croix
	$nMsg = GUIGetMsg()
		if ($nMsg = $GUI_EVENT_CLOSE) then
			exit
		EndIf
WEnd








Func _IEquerySelectorAll(ByRef $oDoc, $sQuery, $iItemIndex = Default)
    If Not IsObj($oDoc) Then
        ConsoleWriteError("--> _IEquerySelectorAll Error: " & $_IEStatus_InvalidDataType & " Invalid DataType" & @LF)
        Return SetError($_IEStatus_InvalidDataType, 1, 0)
    ElseIf Not __IEIsObjType($oDoc, "browserdom") Then
        ConsoleWriteError("--> _IEquerySelectorAll Error: " & $_IEStatus_InvalidObjectType & " Invalid ObjectType" & @LF)
        Return SetError($_IEStatus_InvalidObjectType, 2, 0)
    ElseIf Not IsNumber($iItemIndex) And $iItemIndex <> Default Then
        ConsoleWriteError("--> _IEquerySelectorAll Error: " & $_IEStatus_InvalidValue & " Invalid Index" & @LF)
        Return SetError($_IEStatus_InvalidValue, 3, 0)
    ElseIf $iItemIndex = Default Or $iItemIndex >= 0 Then
        Local $oTemp = Null
        If __IEIsObjType($oDoc, "documentcontainer") Then
            $oTemp = _IEDocGetObj($oDoc)
            ConsoleWriteError("--> _IEDocGetObj Error: " & @error & " Ext: " & @extended & @LF)
            If @error Then Return SetError(@error, @extended, 0)
        Else
            $oTemp = $oDoc
        EndIf
        Local $oClassColl = $oTemp.querySelectorAll($sQuery)
        If @error Then
            ConsoleWriteError("--> _IEquerySelectorAll Error: " & $_IESTATUS_GeneralError & " GeneralError1: " & @error & @LF)
            Return SetError($_IESTATUS_GeneralError, 3, 0)
        ElseIf (Not IsObj($oClassColl)) Or $oClassColl = Null Or $oClassColl.length = 0 Then
            ConsoleWriteError("--> _IEquerySelectorAll Error: " & $_IEStatus_NoMatch & " NoMatch" & @LF)
            Return SetError($_IEStatus_NoMatch, 0, 0) ; Could be caused by parameter 2, 3 or both
        Else
            If $iItemIndex = Default Then
                Return SetError($_IEStatus_Success, $oClassColl.length, $oClassColl)
            ElseIf $iItemIndex > $oClassColl.length Then
                ConsoleWriteError("--> _IEquerySelectorAll Error: " & $_IEStatus_InvalidValue & " Invalid Value" & @LF)
                Return SetError($_IEStatus_InvalidValue, $oClassColl.length, 0)
            Else
                $oItem = $oClassColl.Item($iItemIndex)
                If @error Then
                    ConsoleWriteError("--> _IEquerySelectorAll Error: " & $_IESTATUS_GeneralError & " GeneralError2: " & @error & @LF)
                    Return SetError($_IESTATUS_GeneralError, 3, 0)
                ElseIf (Not IsObj($oItem)) Or $oItem = Null Then
                    ConsoleWriteError("--> _IEquerySelectorAll Error: " & $_IEStatus_NoMatch & " NoMatch Index: " & $iItemIndex & @LF)
                    Return SetError($_IEStatus_NoMatch, 0, 0) ; Could be caused by parameter 2, 3 or both
                Else
                    Return SetError($_IEStatus_Success, 0, $oItem)
                EndIf
            EndIf
        EndIf
    Else
        ConsoleWriteError("--> _IEquerySelectorAll Error: " & $_IEStatus_InvalidValue & " Invalid Value: " & $iItemIndex & @LF)
        Return SetError($_IEStatus_InvalidValue, 3, 0)
    EndIf
EndFunc   ;==>_IEquerySelectorAll

; User's COM error function.
; After SetUp with ObjEvent("AutoIt.Error", ....) will be called if COM error occurs
Func _User_ErrFunc($oError)
    ; Do anything here.
    ConsoleWrite(@ScriptFullPath & " (" & $oError.scriptline & ") : ==> COM Error intercepted !" & @CRLF & _
            @TAB & "err.number is: " & @TAB & @TAB & "0x" & Hex($oError.number) & @CRLF & _
            @TAB & "err.windescription:" & @TAB & $oError.windescription & @CRLF & _
            @TAB & "err.description is: " & @TAB & $oError.description & @CRLF & _
            @TAB & "err.source is: " & @TAB & @TAB & $oError.source & @CRLF & _
            @TAB & "err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
            @TAB & "err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
            @TAB & "err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
            @TAB & "err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
            @TAB & "err.retcode is: " & @TAB & "0x" & Hex($oError.retcode) & @CRLF & @CRLF)
EndFunc   ;==>_User_ErrFunc
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [R] Problème bizarre avec PixelGetColor...

#12

Message par orax »

Le bloc 2 devrait fonctionner, mais ce n'est pas une solution, je ne fais que contourner le problème.

Code : Tout sélectionner

#include <IE.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

; Error monitoring. This will trap all COM errors while alive.
 ; This particular object is declared as local, meaning after the function returns it will not exist.
_IEErrorHandlerRegister("_ErrFunc")


$oIE = _IECreateEmbedded()
$html_GUI = GUICreate("LiveBoxInfos 2.0.0", 820, 530)
$Browser = GUICtrlCreateObj($oIE, -1, -1, 820, 540)
GUISetState()
_IENavigate($oIE, @scriptdir & "/index2.html")

; --Bloc 1--
; Ne fonctionne pas si la ligne
;   <meta http-equiv="X-UA-Compatible" content="IE=edge">
; est présente dans le fichier HTML. Pourquoi ?!
;~ $oButton = $oIE.document.getElementById("abc")
;~ ObjEvent($oButton, "_Evt_")

; --Bloc 2--
; Fonctionne dans tous les cas.
$oButtons = $oIE.document.getElementsByTagName('button')
For $oButton In $oButtons
   ObjEvent($oButton, "_Evt_")
Next

While 1
   ;Fermeture application si on clique sur la croix
   $nMsg = GUIGetMsg()
   if ($nMsg = $GUI_EVENT_CLOSE) then
	  exit
   EndIf
WEnd

Func _Evt_onClick()
   ConsoleWrite("Bouton cliqué." & @CRLF)
EndFunc

Func _ErrFunc($oError)
    ; Do anything here.
    ConsoleWrite(@ScriptName & " (" & $oError.scriptline & ") : ==> COM Error intercepted !" & @CRLF & _
            @TAB & "err.number is: " & @TAB & @TAB & "0x" & Hex($oError.number) & @CRLF & _
            @TAB & "err.windescription:" & @TAB & $oError.windescription & @CRLF & _
            @TAB & "err.description is: " & @TAB & $oError.description & @CRLF & _
            @TAB & "err.source is: " & @TAB & @TAB & $oError.source & @CRLF & _
            @TAB & "err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
            @TAB & "err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
            @TAB & "err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
            @TAB & "err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
            @TAB & "err.retcode is: " & @TAB & "0x" & Hex($oError.retcode) & @CRLF & @CRLF)
EndFunc   ;==>_ErrFunc
Fichier index2.html :

Code : Tout sélectionner

<!DOCTYPE html>
<html>
<head>
<!-- <meta http-equiv="X-UA-Compatible" content="IE=edge"> -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">

</head>
<body>
<button type="button" id="abc">Connexion</button>
<body>
</html>
Le bloc 1 retourne l'erreur COM suivante :
TYPE_E_FIELDNOTFOUND
0x80028017
Field name not defined in the record. (Le nom de rubrique n'est pas défini dans l'enregistrement.)
Voir la liste des codes sur https://msdn.microsoft.com/en-us/librar ... s.85).aspx
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Utilisateur 3309 supprimé
Status : Hors ligne

Re: Problème bizarre avec PixelGetColor...

#13

Message par Utilisateur 3309 supprimé »

Merci beaucoup orax, cette solution me convient très bien !!!

Concernant la balise <meta http-equiv="X-UA-Compatible" content="IE=edge">, elle a pour but de forcer IE a utiliser le moteur de rendu le plus récent, et donc d'éviter le "quirks" mode (passage en IE7), IE aurait tendance a forcer ce mode sur les pages locales/intranet. Si je ne mets pas cette ligne ma mise en page est toute foirée (car j'utilise le css Boostrap ?), peut etre qu'elle ne serait pas necessaire si ma page était hébergée sur internet...je ne sais pas.
Utilisateur 3309 supprimé
Status : Hors ligne

Re: Problème bizarre avec PixelGetColor...

#14

Message par Utilisateur 3309 supprimé »

Ha zut, et si je mets un deuxième bouton, comment je différencie les clics sur l'un ou l'autre bouton si j'utilise la méthode:
$oButtons = $oIE.document.getElementsByTagName('button')
??

Edit:
dans le fichier html j'ajoute dans chaque bouton : name="bouton1" et name="bouton2".
puis j'utilise :

Code : Tout sélectionner

$oButtons1 = $oIE.document.getElementsByName('bouton1')
For $oButton1 In $oButtons1
   ObjEvent($oButton1, "_Evt1_")
Next

$oButtons2 = $oIE.document.getElementsByName('bouton2')
For $oButton2 In $oButtons2
   ObjEvent($oButton2, "_Evt2_")
Next

Func _Evt1_onClick()
...
EndFunc

Func _Evt2_onClick()
...
EndFunc
C'est propre comme ca ?
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: Problème bizarre avec PixelGetColor...

#15

Message par orax »

Si ça marche c'est mieux que rien. Mais ça me dérange de devoir utiliser une boucle For In alors que ça ne devrait pas être nécessaire.

Sur la page Doubts about the ObjEvent() function, Chimp a le même problème. Je pense que le code que tu as posté ici ne fonctionne pas pour les mêmes raisons. Mais j'aurais bien aimé avoir une explication... :?
D'après ce que j'ai compris, le code de Chimp utilise une référence à l'objet Javascript global. Je ne sais vraiment pas quelle méthode est la plus propre. Je mets deux codes où je me suis inspiré de sa méthode. Il est possible que ça ne marche qu'avec IE 11 et supérieur.

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
#include <string.au3>
#include <file.au3>

Global $oDocument

Example()

Func Example()
    ; read html page from bottom of this script
    ; and write it to a temp file on disk for later
    ; usage by the $oIE.navigate
    Local $sFilename = CreateHtmlPage()

    Local $hGUIMain = GUICreate("Event Test", 540, 400)

    ; We generate the Browser Control...
    Global $oIE = ObjCreate("Shell.Explorer.2")

    ; and we embed it into the AutoIt GUI
    $hIE = GUICtrlCreateObj($oIE, 5, 5, 530, 390)

    GUISetState() ;Show GUI

    ; load in the browser the previously created web page
    $oIE.navigate('file:///' & $sFilename)

    Do ; wait for document
        Sleep(250)
        $oDocument = $oIE.document
    Until IsObj($oDocument)
    ; $oDocument.execCommand("Refresh")

    ; $ohJS is a reference to the javascript Global Obj
    ; JSglobal is a variable created within the HTML
    ; https://msdn.microsoft.com/en-us/library/52f50e9t(v=vs.94).aspx
    ; -------------------------------------------------
    Global $ohJS = $oIE.document.parentwindow.JSglobal


	  ObjEvent($oDocument, "DocEvent2_", "HTMLDocumentEvents2")

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
        EndSwitch
    WEnd

    ; the end
    $oIE = 0 ; Remove IE from memory (not really necessary).
    GUIDelete($hGUIMain) ; Remove GUI
    FileDelete($sFilename)
EndFunc   ;==>Example

; following function should be fired by events
; occurred in the browser's objects
;
; The function automatically called by an event
; will receive as parameter an Event Obj.
; This obj is loaded with many properties related to
; the object that fired the event. See following link:
; https://msdn.microsoft.com/en-us/library/aa703876(v=vs.85).aspx

; --- events management zone ---
Volatile Func DocEvent2_onClick($oEvent)
   Local $sID = $oEvent.srcElement.id
   ConsoleWrite("ID = " & $sID & @CRLF)

   Switch $sID
   Case "btn1"
	  ConsoleWrite("Bouton 1" & @CRLF)
   Case "btn2"
	  ConsoleWrite("Bouton 2" & @CRLF)
   Case Else
	  ConsoleWrite(StringFormat("L'élément <%s> n'a pas d'ID\r\n", $oEvent.srcElement.nodeName))
   EndSwitch
EndFunc   ;==>DocEvent2_onClick

; ------------------------------

Func ConsolePrint($sMsg)
    ConsoleWrite($sMsg & @CRLF)
EndFunc   ;==>ConsolePrint

Func _ObjDescription(ByRef $oObj, $msg = "") ; for debug purpose
    ConsoleWrite('--Debug:----------------------------------------------------------------------------' & @CRLF & _
            "[" & $msg & "]" & @CRLF)
    If IsObj($oObj) Then
        ConsoleWrite( _
                'The name of the Object:.......................' & ObjName($oObj, $OBJ_NAME) & @CRLF & _
                'Description string of the Object:.............' & ObjName($oObj, $OBJ_STRING) & @CRLF & _
                'The ProgID of the Object:.....................' & ObjName($oObj, $OBJ_PROGID) & @CRLF & _
                'file associated with the obj in the Registry:.' & ObjName($oObj, $OBJ_FILE) & @CRLF & _
                'Module name in which the object runs:.........' & ObjName($oObj, $OBJ_MODULE) & @CRLF & _
                "CLSID of the object's coclass:................" & ObjName($oObj, $OBJ_CLSID) & @CRLF & _
                "IID of the object's interface:................" & ObjName($oObj, $OBJ_IID) & @CRLF)
    Else
        ConsoleWrite("Is not an object" & @CRLF)
    EndIf
EndFunc   ;==>_ObjDescription

Func CreateHtmlPage()
    Local $aArray = StringRegExp(FileRead(@ScriptFullPath), "(?s)\R#cs;HTML\R(.+?)#ce;HTML(?:\R|$)", 3)
    Local $sPage = _TempFile(@ScriptDir, Default, ".html")
    Local $hFile = FileOpen($sPage, 2) ;  $FO_OVERWRITE (2) = Write mode (erase previous contents)
    FileWrite($hFile, $aArray[0])
    FileClose($hFile)
    Return $sPage
EndFunc   ;==>CreateHtmlPage

#cs;HTML
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<script type="text/javascript">var JSglobal=(1,eval)("this");</script>
</head>
<body>
<button type="button" id="btn1">Connexion</button>
<button type="button" id="btn2">Connexion 2</button>
<body>
</html>
#ce;HTML
;

Code : Tout sélectionner

#include <IE.au3>
#include <File.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

; Error monitoring. This will trap all COM errors while alive.
 ; This particular object is declared as local, meaning after the function returns it will not exist.
_IEErrorHandlerRegister("_ErrFunc")

$oIE = _IECreateEmbedded()
$html_GUI = GUICreate("LiveBoxInfos 2.0.0", 820, 530)
$Browser = GUICtrlCreateObj($oIE, -1, -1, 820, 540)
GUISetState()

$sFilename = CreateHtmlPage()
_IENavigate($oIE, $sFilename)

; Ne marche pas !! Pourquoi ?
;~ $oButton = $oIE.document.getElementById("a")
;~ ObjEvent($oButton, "_Evt_")

; Mais de cette façon, ça marche...
; https://www.autoitscript.com/forum/topic/186320-doubts-about-the-objevent-function/
$ohJS = $oIE.document.parentwindow.JSglobal
ObjEvent($ohJS.btn1, "_Evt_btn1_")
ObjEvent($ohJS.btn2, "_Evt_btn2_")

While 1
   ;Fermeture application si on clique sur la croix
   $nMsg = GUIGetMsg()
   if ($nMsg = $GUI_EVENT_CLOSE) then
	  ExitLoop
   EndIf
WEnd

FileDelete($sFilename)

Func _Evt_btn1_onclick()
   ConsoleWrite("Bouton 1" & @CRLF)
EndFunc

Func _Evt_btn2_onclick()
   ConsoleWrite("Bouton 2" & @CRLF)
EndFunc

Func _ErrFunc($oError)
    ; Do anything here.
    ConsoleWrite(@ScriptName & " (" & $oError.scriptline & ") : ==> COM Error intercepted !" & @CRLF & _
            @TAB & "err.number is: " & @TAB & @TAB & "0x" & Hex($oError.number) & @CRLF & _
            @TAB & "err.windescription:" & @TAB & $oError.windescription & @CRLF & _
            @TAB & "err.description is: " & @TAB & $oError.description & @CRLF & _
            @TAB & "err.source is: " & @TAB & @TAB & $oError.source & @CRLF & _
            @TAB & "err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
            @TAB & "err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
            @TAB & "err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
            @TAB & "err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
            @TAB & "err.retcode is: " & @TAB & "0x" & Hex($oError.retcode) & @CRLF & @CRLF)
EndFunc   ;==>_ErrFunc

Func CreateHtmlPage()
    Local $aArray = StringRegExp(FileRead(@ScriptFullPath), "(?s)\R#cs;HTML\R(.+?)#ce;HTML(?:\R|$)", 3)
    Local $sPage = _TempFile(@ScriptDir, Default, ".html")
    Local $hFile = FileOpen($sPage, 2) ;  $FO_OVERWRITE (2) = Write mode (erase previous contents)
    FileWrite($hFile, $aArray[0])
    FileClose($hFile)
    Return $sPage
EndFunc   ;==>CreateHtmlPage

#cs;HTML
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<script type="text/javascript">var JSglobal=(1,eval)("this");</script>
</head>
<body>
<button type="button" id="btn1">Connexion</button>
<button type="button" id="btn2">Connexion 2</button>
<body>
</html>
#ce;HTML
;
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Utilisateur 3309 supprimé
Status : Hors ligne

Re: Problème bizarre avec PixelGetColor...

#16

Message par Utilisateur 3309 supprimé »

Merci, je vais analyser tout ca !

Edit:
Si j'ai bien compris, dans la 1ere methode:
$ohJS = $oIE.document.parentwindow.JSglobal
et le script JS dans le fichier html ne sont pas utiles, c'est uniquement pour la 2eme methode.

Bon au final je me retrouve avec 3 alternatives à pixelgetcolor, qui marchent et qui ne plante pas :wink:
Répondre