Passage de souris sur un webbrowser

Le
Gloops
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 webbrowse=
r
permette d'arrêter son défilement.

J'ai commencé plus modeste, pour le moment c'est le passage de la souri=
s
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éfile=
r
ou pas. ça marche.

Pour réagir au passage de la souris sur le webbrowser ça se gâte, c=
ar ce
n'est pas le webbrowser qui reconnaît lui-même l'événement MouseH=
over,
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 par=
le
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, d=
onc
une fois le Body chargé, ça ne semble pas probant non plus. Qui dit m=
ieux ?
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Gilles TOURREAU
Le #12170251
Le Tue, 09 Oct 2007 13:06:37 +0200, Gloops
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
Gloops
Le #12170211
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.
Gloops
Le #12170181
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.
Gloops
Le #12170171
[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.
Publicité
Poster une réponse
Anonyme