[R] Comment interdire tte interaction avec IE incorporé ?

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] Comment interdire tte interaction avec IE incorporé ?

#1

Message par hilow »

Bonjour,

Je débute AutoIt (depuis 15j) et suis sur un script d'automation autour d'un navigateur web incorporé : j'utilise donc IE.au3. Je souhaite interdire tout accès utilisateur au navigateur lorsque le script est en plein job (certaines opération pouvant durer plusieurs dizaines de minutes). Alors, je pourrais peut-être injecter du javascript dans chaque page pour gérer ça, mais j'aurais préférer quelque chose au niveau du contrôle IE lui-même : une sorte de GUICtrlSetState($oIE, $GUI_DISABLE), quoi :)

A noter que le navigateur doit rester visible (l'utilisateur peut observer le déroulement, mais pas interagir inside)

Y a-t-il ça en stock ? Voyez-vous une méthode ?
Modifié en dernier par hilow le sam. 07 avr. 2012 13:06, modifié 1 fois.
Avatar du membre
PandiPanda
Membre émérite
Membre émérite
Messages : 656
Enregistré le : mar. 19 juil. 2011 14:03
Localisation : Bruxelles
Status : Hors ligne

Re: [..] Comment interdire tte interaction avec IE incorporé

#2

Message par PandiPanda »

Bonjour,
Je suppose que vous afficher votre page dans une GUI?
► Afficher le texte
avec un "GUICtrlSetState($GUIActiveX,$GUI_DISABLE)" cela ne vous convient pas ?
La seule moralité qui tienne dans un monde cruel est la chance. Impartiale. Équitable. Vraie
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Comment interdire tte interaction avec IE incorporé

#3

Message par mikell »

Panda, tu as testé ton script ? :mrgreen:

Le risque avec le Disable est de figer la page IE, qui ne pourra pas être actualisée avec un $oIE.Refresh par exemple et t'inondera de messages d'erreur (or il a bien dit : "l'utilisateur peut observer le déroulement..." )
Donc je propose une solution problem-contourning rusée, à savoir une label transparente de la taille du controle activeX, que tu superposes ou pas
► Afficher le texte
ou en reprenant ton script (impossible de cliquer sur la page, mais les boutons restent actifs) :
► Afficher le texte
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
hilow
Niveau 2
Niveau 2
Messages : 28
Enregistré le : jeu. 05 avr. 2012 10:07
Localisation : 78/28
Status : Hors ligne

Re: [..] Comment interdire tte interaction avec IE incorporé

#4

Message par hilow »

Merci à tous les deux. Alors, dans l'ordre :

Oui, le IE est bien dans une GUI :

Code : Tout sélectionner

$ui = GUICreate($caption, 800, 600)
$wb = _IECreateEmbedded()
GUICtrlCreateObj($wb, ...)
Oui, il ne faut rien figer car mon code fait du refresh, du navigate, des saisies et clics : bref, ça bouge :)

Je ne suis pas devant le PC, là, mais je vais tester ta solution, mikell. En tout cas, dans le principe, ça me plaît (hé hé).

A plus tard. Je reviendrai vous dire...
hilow
Niveau 2
Niveau 2
Messages : 28
Enregistré le : jeu. 05 avr. 2012 10:07
Localisation : 78/28
Status : Hors ligne

Re: [..] Comment interdire tte interaction avec IE incorporé

#5

Message par hilow »

Alors, j'ai testé et voilà le résultat :

Tant que le navigateur ne fait rien, ça marche :

Code : Tout sélectionner

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

GUICreate("essai")

$wb = _IECreateEmbedded()
GUICtrlCreateObj($wb, 10, 30, 70, 50)

$lbl = GUICtrlCreateLabel("", 5, 25, 60, 40)
GUICtrlSetBkColor($lbl, 0x00ff00)

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

GUISetState()
Do
    $msg = GUIGetMsg()
Until $msg = $GUI_EVENT_CLOSE
Mais dès qu'il navigue (en décommentant la ligne ad hoc ci-dessus), le navigateur revient au premier plan.

Alors, je pourrais écrire une petite fonction wrapper pour _IENavigate, qui rétablirait le z-order du label après chaque navigation... Si vous avez une autre idée, n'hésitez pas :)

Affaire à suivre...
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Comment interdire tte interaction avec IE incorporé

#6

Message par mikell »

Je te rappelle que si tu veux que la label reste au 1er plan, il faut le lui dire...

Code : Tout sélectionner

GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetState(-1, $GUI_ONTOP)   [color=#FF0000];<<<<<<<[/color]
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
hilow
Niveau 2
Niveau 2
Messages : 28
Enregistré le : jeu. 05 avr. 2012 10:07
Localisation : 78/28
Status : Hors ligne

Re: [..] Comment interdire tte interaction avec IE incorporé

#7

Message par hilow »

Bon, j'ai fait des tests et ce n'est pas encore ça. Le $GUI_ONTOP est perdu après navigation et ne semble pas être rétablissable même en le forçant (enfin, chez moi en tout cas).

Voici mon code de test :

Code : Tout sélectionner

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

$url = "http://google.com"

GUICreate("essai", 300, 300)
$razorder = GUICtrlCreateButton("reset z-order", 100, 30, 150, 25)
$nav_std = GUICtrlCreateButton("nav standard", 20, 100, 150, 25)
$nav_wrapper = GUICtrlCreateButton("nav wrapper", 20, 140, 150, 25)
$nav_wrapper_ro = GUICtrlCreateButton("nav wrapper read-only", 20, 180, 150, 25)

$wb = _IECreateEmbedded()
GUICtrlCreateObj($wb, 10, 30, 70, 50)

$wb_shield = GUICtrlCreateLabel("", 5, 25, 60, 40)
GUICtrlSetBkColor($wb_shield, 0x00ff00)
GUICtrlSetState($wb_shield, $GUI_ONTOP)

GUISetState()
While 1
    $msg = GUIGetMsg()

    Switch $msg
        Case $GUI_EVENT_CLOSE
            Exit(0)
        case $razorder
            GUICtrlSetState($wb_shield, $GUI_ONTOP)
        Case $nav_std
            _IENavigate($wb, $url, 1)
        Case $nav_wrapper
            Navigate($url)
        Case $nav_wrapper_ro
            Navigate($url, True)
    EndSwitch
WEnd

Func Navigate($url, $readonly = False)
    ; Navigation w/ eventual read-only management
    ; IN : URL to reach, flag indicating user can't interact w/ browser
    ; OUT : sucess:true ; failure:false
    ; GLB : $wb as embedded IE, $wb_shield w/ same coord than $wb to mimic read-only
    If Not _IENavigate($wb, $url, 1) Then Return False
    If $readonly Then GUICtrlSetState($wb_shield, $GUI_ONTOP)
    Return True
EndFunc
Avez-vous une idée ?

--
EDIT : oui, mikell, c'était un oubli ds mon code de test. Mais, l'ayant rajouté, je comprends encore moins car voici l'étrangeté : avec GUICtrlSetState($wb_shield, $GUI_ONTOP), le label passe dessous, tandis que sans cette ligne (avant navigation), il est au-dessus (le vert est devant le navigateur) ;??? Bizarre

--
EDIT #2 : et, dans tous les cas, mon bouton $razorder n'a aucun effet : le GUICtrlSetState($wb_shield, $GUI_ONTOP) ne change rien au z-order courant (c-a-d qu'il ne fait pas passer le label devant s'il était derrière ni ne le met derrière s'il était devant comme ça semble le faire au démarrage de l'appli (voir mon EDIT ci-dessus)... Bon, faut que je me détende :evil:

--
EDIT #3 : J'ai créé un code test le plus simple, avec deux labels... Et chez moi le GUI_ONTOP ne semble pas fonctionner (tester sur une station XP ; faudrait que je regarde sur une autre aussi, mais il faut que ça fonctionne partout ds tous les cas - donc, ce cas-ci est à régler). Voici donc ce test dans lequel le label FRONT devrait être en avant-plan et ne l'est pas chez moi :

Code : Tout sélectionner

#include <GUIConstantsEx.au3>

GUICreate("$GUI_ONTOP Test", 300, 300)

$front = GUICtrlCreateLabel("FRONT", 15, 40, 60, 40)
GUICtrlSetBkColor($front, 0xff0000)

$back = GUICtrlCreateLabel("BACK", 5, 25, 60, 40)
GUICtrlSetBkColor($back, 0x00ff00)

GUICtrlSetState($front, $GUI_ONTOP)

GUISetState()
While GUIGetMsg() <> $GUI_EVENT_CLOSE
WEnd
Qué né passa :shock: ?
hilow
Niveau 2
Niveau 2
Messages : 28
Enregistré le : jeu. 05 avr. 2012 10:07
Localisation : 78/28
Status : Hors ligne

Re: [..] Comment interdire tte interaction avec IE incorporé

#8

Message par hilow »

Ya quelqu'un ?

Alors, des nouvelles. J'ai voulu en avoir le coeur net et ai essayé sur une autre station XP : idem. Puis sous Vista : idem :( J'ai donc tenté par l'API Win32, par dexu chemins (_WinAPI_SetWindowPos et DllCall direct) comme ça :

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
#include <Constants.au3>
#include <WinAPI.au3>

GUICreate("$GUI_ONTOP Test via Win API", 300, 300)

$front = GUICtrlCreateLabel("FRONT", 15, 40, 60, 40)
GUICtrlSetBkColor($front, 0xff0000)

$back = GUICtrlCreateLabel("BACK", 5, 25, 60, 40)
GUICtrlSetBkColor($back, 0x00ff00)

$front_hwnd = GUICtrlGetHandle($front)
_WinAPI_SetWindowPos($front_hwnd, $HWND_TOP, -1, -1, -1, -1, BitOr($SWP_NOMOVE, $SWP_NOSIZE))

;~ SetWindowPos($front_hwnd, $HWND_TOPMOST + $HWND_TOP, 0, 0, 0, 0, BitOR($SWP_NOMOVE,$SWP_NOSIZE))
;~ Func SetWindowPos($hwnd, $InsertHwnd, $X, $Y, $cX, $cY, $uFlags)
;~     $ret = DllCall("user32.dll", "long", "SetWindowPos", "hwnd", $hwnd, "hwnd", $InsertHwnd, _
;~     "int", $X, "int", $Y, "int", $cX, "int", $cY, "long", $uFlags)
;~ EndFunc

GUISetState()
While GUIGetMsg() <> $GUI_EVENT_CLOSE
WEnd
Et sur les trois stations, le label BACK vert reste en avant-plan (sic).

Qu'en pensez-vous ? J'utilise AutoIt dernière versions (prod et beta).
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Comment interdire tte interaction avec IE incorporé

#9

Message par mikell »

Effectivement, il y a là un sacré problème
J'ai fait plusieurs tests sur ton exemple avec la page de google
Disons pour résumer qu'on arriverait à rendre la page insensible aux clics de souris, mais pour les frappes clavier là c'est plus dur
Un truc à tester serait, dès que la page a fini de charger, de donner le focus à autre chose
► Afficher le texte
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
hilow
Niveau 2
Niveau 2
Messages : 28
Enregistré le : jeu. 05 avr. 2012 10:07
Localisation : 78/28
Status : Hors ligne

Re: [..] Comment interdire tte interaction avec IE incorporé

#10

Message par hilow »

Oui, je vois, effectivement : ni focus ni souris, ça me parait parfait. Ensuite, il y aura tjrs un contournement possible, mais bon, ce serait déjà bien : je garde le sujet dans un coin... J'essaie de trouver pourquoi ce @$*}% de mise en avant-plan ne fonctionne pas. J'ai des appli en topmost qui fonctionnent très bien, alors je ne vois pas pourquoi là ça ne répond pas. Faudrait que je prenne le temps d'écrire l'équivalent hors AutoIt pour voir si c'est global ou pas.

M'enfin, merci de ton aide pour mon baptème de l'AutoIt, mikell :)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Comment interdire tte interaction avec IE incorporé

#11

Message par mikell »

Ahem sorry des fois je suis vraiment pas vif
C'est toujours pareil... si on veut qu'une fenêtre gère des controles superposés, ben il faut le lui dire ^^

Code : Tout sélectionner

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

$gui = GUICreate("$GUI_ONTOP Test", 300, 300, -1, -1, -1, BitOR($WS_EX_LAYERED, $WS_EX_COMPOSITED))
$front = GUICtrlCreateLabel("FRONT", 15, 40, 60, 40)
GUICtrlSetBkColor($front, 0xff0000)
$back = GUICtrlCreateLabel("BACK", 5, 25, 60, 40)
GUICtrlSetBkColor($back, 0x00ff00)
GUISetState()

GUICtrlSetState($front, $GUI_ONTOP)

While GUIGetMsg() <> $GUI_EVENT_CLOSE
WEnd
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
hilow
Niveau 2
Niveau 2
Messages : 28
Enregistré le : jeu. 05 avr. 2012 10:07
Localisation : 78/28
Status : Hors ligne

Re: [..] Comment interdire tte interaction avec IE incorporé

#12

Message par hilow »

Yeah, t'es un chef ;) Puisque tu parlais de lenteur, je crois que j'ai battu un record, là : bien que n'ayant jamais eu besoin d'utiliser de "layered window", je pratique tout de même Windows depuis sa version 1.0 et suis resté des lustres sous Win 2K (je crois qu'elles sont apparues à cette époque), alors, hummm. Bon, on ne va pas dire que je suis mauvais, mais que ma mémoire sature :lol: Merci mikell

--
EDIT : je passe donc le fil en résolu :)
Répondre