Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Passage de souris sur un webbrowser

4 réponses
Avatar
Gloops
Bonjour tout le monde,

Avec l'aide de Gilles j'ai r=E9ussi =E0 faire d=E9filer mon webbrowser.

Pour m=E9moire :

HtmlWindow dom =3D webBrowser1.Document.Window;
mshtml.IHTMLWindow2 rawWindow =3D (mshtml.IHTMLWindow2) dom.DomWindow;
HtmlElement el =3D webBrowser1.Document.Body;
rawWindow.scrollBy(0, 1);
if (posvert =3D=3D el.ScrollTop)
{
rawWindow.scrollTo(0, 0);
}
else
{
posvert =3D el.ScrollTop;
}

(posvert est un entier test=E9 pour v=E9rifier que je ne suis pas arriv=E9=
=20
tout en bas de la page, auquel cas je retourne en haut)

A pr=E9sent, j'aimerais bien que le passage de la souris sur le webbrowse=
r=20
permette d'arr=EAter son d=E9filement.

J'ai commenc=E9 plus modeste, pour le moment c'est le passage de la souri=
s=20
sur un contr=F4le =E9tiquette, =E0 c=F4t=E9, qui arr=EAte le d=E9filement=
du webbrowser.

Une variable bool=E9enne booYenaSouris, d=E9clar=E9e au niveau du module,=
est=20
mise =E0 vrai par l'=E9v=E9nement label1.MouseHover, =E0 faux par l'=E9v=E9=
nement=20
label1.MouseLeave.

Dans le Timer2_Tick, je teste la variable pour savoir si je fais d=E9file=
r=20
ou pas. =E7a marche.

Pour r=E9agir au passage de la souris sur le webbrowser =E7a se g=E2te, c=
ar ce=20
n'est pas le webbrowser qui reconna=EEt lui-m=EAme l'=E9v=E9nement MouseH=
over,=20
mais HtmlElement, donc webBrowser.Document.Body.

Par corollaire, cet =E9v=E9nement n'est pas propos=E9 par d=E9faut par=20
l'interface de d=E9veloppement, donc il faut le d=E9clarer soi-m=EAme, =E0=
moins=20
que j'aie loup=E9 un truc.

Je suis tent=E9 par ceci :

this.webBrowser1.Document.Body.MouseOver +=3D new=20
System.Windows.Forms.HtmlElementEventHandler(this.webBrowser1_MouseHover)=
;

(=E7a fait une ligne de code ; probablement deux lignes de newsgroup)
et un peu plus loin :

private void webBrowser1_MouseHover(object sender, System.EventArgs e)
{
this.booYenaSouris =3D true;
}

Le tout sans Intellisense, j'imagine que l=E0, on n'y coupe pas.

L'os, c'est que l=E0 o=F9 je tente de d=E9finir Body.MouseOver, on me par=
le=20
d'une instance non d=E9clar=E9e.

J'ai essay=E9 de mettre =E7a dans Form_Load, ce n'est peut-=EAtre pas le =
bon=20
endroit ? Dans Timer1_Tick apr=E8s le rafra=EEchissement de WebBrowser, d=
onc=20
une fois le Body charg=E9, =E7a ne semble pas probant non plus. Qui dit m=
ieux ?

4 réponses

Avatar
Gilles TOURREAU
Le Tue, 09 Oct 2007 13:06:37 +0200, Gloops a écrit:

Bonjour tout le monde,

Avec l'aide de Gilles j'ai réussi à faire défiler mon webbrowser.

Pour mémoire :

HtmlWindow dom = webBrowser1.Document.Window;
mshtml.IHTMLWindow2 rawWindow = (mshtml.IHTMLWindow2) dom.DomWindow;
HtmlElement el = webBrowser1.Document.Body;
rawWindow.scrollBy(0, 1);
if (posvert == el.ScrollTop)
{
rawWindow.scrollTo(0, 0);
}
else
{
posvert = el.ScrollTop;
}

(posvert est un entier testé pour vérifier que je ne suis pas arrivé
tout en bas de la page, auquel cas je retourne en haut)

A présent, j'aimerais bien que le passage de la souris sur le webbrowser
permette d'arrêter son défilement.

J'ai commencé plus modeste, pour le moment c'est le passage de la souris
sur un contrôle étiquette, à côté, qui arrête le défilement du
webbrowser.

Une variable booléenne booYenaSouris, déclarée au niveau du module, est
mise à vrai par l'événement label1.MouseHover, à faux par l'événement
label1.MouseLeave.

Dans le Timer2_Tick, je teste la variable pour savoir si je fais défiler
ou pas. ça marche.

Pour réagir au passage de la souris sur le webbrowser ça se gâte, car ce
n'est pas le webbrowser qui reconnaît lui-même l'événement MouseHover,
mais HtmlElement, donc webBrowser.Document.Body.

Par corollaire, cet événement n'est pas proposé par défaut par
l'interface de développement, donc il faut le déclarer soi-même, à moins
que j'aie loupé un truc.

Je suis tenté par ceci :

this.webBrowser1.Document.Body.MouseOver += new
System.Windows.Forms.HtmlElementEventHandler(this.webBrowser1_MouseHover);

(ça fait une ligne de code ; probablement deux lignes de newsgroup)
et un peu plus loin :

private void webBrowser1_MouseHover(object sender, System.EventArgs e)
{
this.booYenaSouris = true;
}

Le tout sans Intellisense, j'imagine que là, on n'y coupe pas.

L'os, c'est que là où je tente de définir Body.MouseOver, on me parle
d'une instance non déclarée.

J'ai essayé de mettre ça dans Form_Load, ce n'est peut-être pas le bon
endroit ? Dans Timer1_Tick après le rafraîchissement de WebBrowser, donc
une fois le Body chargé, ça ne semble pas probant non plus. Qui dit
mieux ?



L'astuce pour garder quelques cheveux est la suivante :

Créer un UserControl qui contient un contrôle WebBrowser.

Vous pourrez ainsi récuperer les événements MouseHover, ...etc
Cependant cette méthode vous oblige à créer des "propriétés/méthodes
indirectes" pour manipuler votre WebBrowser dans votre UserControl.

Par exemple :

Vous serez obliger d'ajouter une méthode Naviguate comme ceci dans votre
UserControl :

public void Navigate(string url)
{
this.webBrowser.Navigate(url);
}

...etc

Cordialement

--
Gilles TOURREAU


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Avatar
Gloops
Gilles TOURREAU a écrit, le 10/10/2007 18:20 :
L'astuce pour garder quelques cheveux est la suivante :



Je m'étais bien posé quelques questions en me voyant dans la glace, a ussi ;)


Créer un UserControl qui contient un contrôle WebBrowser.

Vous pourrez ainsi récuperer les événements MouseHover, ...etc
Cependant cette méthode vous oblige à créer des "propriétés/m éthodes
indirectes" pour manipuler votre WebBrowser dans votre UserControl.

Par exemple :

Vous serez obliger d'ajouter une méthode Naviguate comme ceci dans vo tre
UserControl :

public void Navigate(string url)
{
this.webBrowser.Navigate(url);
}



Ah, oui, de quoi s'amuser un peu, en somme.
Bon, merci pour cette piste intéressante.
Avatar
Gloops
Re,

Avant de m'attaquer au cœur du sujet, histoire de jouer le petit futé ,
je me suis dit que j'allais voir où se trouve le curseur de la souris,
histoire de comparer ça à la position du webbrowser. ça semble êt re
peut-être une fausse piste dans le cas traité en tête de fil, mais dans
d'autres buts ça peut servir.

Pour finir, pas très bon pour les cheveux non plus, vu que la premièr e
réponse cible plutôt les consoles de jeux, et qu'il faut attaquer la
cinquième ou sixième réponse de la liste pour avoir affaire à des
fonctions basées sur USER32.DLL, dont je sais que j'ai ça sur ma mach ine
puisque je l'ai plus d'une fois appelé depuis VB6.

Moyennant quoi, il n'y a pas vraiment de question, juste un témoignage :
mince, je ne me suis pas méfié, j'ai passé du temps à lire les détails
d'une procédure pas destinée à être utilisée sur ma machine.

En arrivant sur une rubrique du site Microsoft, au départ de l'aide de
Visual Studio, il faut faire attention au chemin, dans le contrôle
"chemin de fer", en haut de la page, ça donne une info dont l'importanc e
est supérieure à ce que laissent croire les apparences : si le chemin
passe par un répertoire jeux (ou games) alors qu'on est en train de
développer une application bureautique, ça peut être intéressant de
commencer par aller voir un peu plus loin dans les résultats de
recherche, avant de revenir sur ses pas si il s'avère que plus loin ce
n'est pas trop ça.
Avatar
Gloops
[Arrêt du défilement d'un webbrowser lorsque la souris passe dessus,
grâce à une variable booléenne booYenaSouris définie au niveau du
formulaire ; dernière proposition : définir un UserControl pour gér er le
déplacement de la souris sur le webbrowser]


Bonjour,

Le UserControl fait partie de mon programme de révisions, pour le momen t
je m'en suis sorti avec quelque chose qui paraît plus léger, et qui
fonctionne si on ne bouge pas la souris trop vite :

private void Form_Defilement_MouseMove(
object sender, MouseEventArgs e)
{
int gauche = e.X;
int haut = e.Y;
if (gauche < webBrowser1.Left - 10 |
gauche > webBrowser1.Right + 10 |
haut < webBrowser1.Top - 10 |
haut > webBrowser1.Bottom + 10)
{
this.booYenaSouris = false;
}
else
{
this.booYenaSouris = true;
}
}

Bien entendu ça marche si le formulaire n'est pas trop chargé, sinon il
faut gérer le déplacement de la souris sur chaque contrôle. Là il y a
une étiquette, qui en plus ne sert pas à grand-chose, elle n'a plus q u'à
se faire toute petite et ça fait la rue Michel.

A noter : il faut aussi laisser plus de dix unités de place autour du
webbrowser pour que le curseur de la souris puisse s'en éloigner, sinon
on ne le verra pas passer. Dit autrement le formulaire doit présenter
des marges, après tout ce n'est pas plus moche.