Hook : Erreur sur traitement partiel [Résolu]

Signaler
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009
-
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009
-
Salut tous le monde,

Je suis en train de me prendre la tête sur le WebBrowser ...
J'aimerais prendre pocéssion des cliques souris : gauche, milieu et droit.
Le gauche, simplement pour lancer un event, le droit et le milieu pour leurs personnaliser le traitement.

Test 1  : Surcharge de WnProc : Pas d'événements souris
Test 2 : Interface (je sais plus le nom) pour intercépter les messages, à la WnProc : Idem, pas dévénements souris
Test 3 : Je me sers des événements Document (que je place après le DocumentComplete) et qui possède un Click... infos souris vides et pas beaucoup de libertés

Résolution... Hook, voila donc  :
        protected static int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
        {
            User32.MOUSEHOOKSTRUCT mouseParams = (User32.MOUSEHOOKSTRUCT)
                                                Marshal.PtrToStructure(lParam, typeof(User32.MOUSEHOOKSTRUCT));
            Control activeControl = Control.FromChildHandle(mouseParams.hwnd);
            User32.MouseEvent intParam = (User32.MouseEvent)wParam.ToInt32();


            if (nCode > 0 && intParam != User32.MouseEvent.WM_MOUSEMOUVE && activeControl != null && 
                     activeControl.GetType() == typeof(AdvancedWebBrowser))
            {
                if (intParam == User32.MouseEvent.WM_MBUTTONUP)
                {
                    ((AdvancedWebBrowser)activeControl).MouseHookEvent(mouseParams, MouseHookButton.Middle);
                    return 1;
                }
                if (intParam == User32.MouseEvent.WM_RBUTTONUP)
                {
                    ((AdvancedWebBrowser)activeControl).MouseHookEvent(mouseParams, MouseHookButton.Right);
                    return 1;
                }
            }
            returnUser32.CallNextHookEx(_currentHook, nCode, wParam, lParam);
        }
Ici, je traite le bouton droit et le bouton du milieu.

Mon problème est le suivant :
Quand je souhaite utiliser ma méthode pour le bouton gauche(pour lancer un event), je ne retourne pas 1 pour ne pas intérrompre le cycle.... mais problème, ca plante : L'application fige, la souris aussi, pas d'erreur et le clique souris n'est jamais pris en compte (pour défiger, il me suffit de lui faire perdre le focus).

J'ai essayé en Asynchrone, ca ne marche pas mieux.

Soit je fais n'importe quoi, soit y a juste un ptit truc à changer...

Je préférais quand meme passer par autre chose que le hook pour résoudre mon pb.







<hr />

I love .net

6 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
32
Apparemment c'est l'évènement DocumentCompleted qui est appelé 2 fois, faut mettre un booléen pour ne pas enregistrer le MouseDown 2 fois, ou comprendre d'ou vient cet effet de bord.
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
32
Après quelques tests.. en fait l'évènement est appelé à chaque chargement d'une nouvelle page, jusque là ok.  mais le HtmlDocument est toujours le même donc ça accumule les gestionnaires d'évènements.
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
32
Salut, qu'est-ce qui cloche avec le test n° 3 ?

public partial class Form1 : Form
{
    public Form1( )
    {
        InitializeComponent( );


        this.Size = new Size( 640, 480 );


        WebBrowser wb = new WebBrowser( );
        wb.Parent = this;
        wb.Dock = DockStyle.Fill;
        wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler( WebBrowser_DocumentCompleted );
        wb.Url = new Uri( "http://www.wickedweasel.com" );


    }


    private void WebBrowser_DocumentCompleted( object sender, WebBrowserDocumentCompletedEventArgs args )
    {
        HtmlDocument htmldoc = ( ( WebBrowser )sender ).Document;
        htmldoc.MouseDown += new HtmlElementEventHandler( HtmlDoc_MouseDown );
    }


    private void HtmlDoc_MouseDown( object sender, HtmlElementEventArgs args )
    {
        MessageBox.Show( args.MousePosition + "\r\n" + args.MouseButtonsPressed );
    }
}
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009

Ok... j'ai testé que sur le click, que ne transmet le bouton...

<hr />I love .net
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009

ce qui cloche un peu, c'est que l'évenement est déclenché 2 fois par simples clicks

<hr />I love .net
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009

pfff... là, j'assure vraiment pas...

<hr />I love .net