Hook : Erreur sur traitement partiel

Résolu
cs_Yxion Messages postés 219 Date d'inscription jeudi 6 juillet 2006 Statut Membre Dernière intervention 7 septembre 2009 - 11 oct. 2007 à 14:19
cs_Yxion Messages postés 219 Date d'inscription jeudi 6 juillet 2006 Statut Membre Dernière intervention 7 septembre 2009 - 11 oct. 2007 à 20:53
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

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
11 oct. 2007 à 19:20
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.
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
11 oct. 2007 à 19:30
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.
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
11 oct. 2007 à 17:27
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 );
    }
}
0
cs_Yxion Messages postés 219 Date d'inscription jeudi 6 juillet 2006 Statut Membre Dernière intervention 7 septembre 2009
11 oct. 2007 à 17:31
Ok... j'ai testé que sur le click, que ne transmet le bouton...

<hr />I love .net
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Yxion Messages postés 219 Date d'inscription jeudi 6 juillet 2006 Statut Membre Dernière intervention 7 septembre 2009
11 oct. 2007 à 17:48
ce qui cloche un peu, c'est que l'évenement est déclenché 2 fois par simples clicks

<hr />I love .net
0
cs_Yxion Messages postés 219 Date d'inscription jeudi 6 juillet 2006 Statut Membre Dernière intervention 7 septembre 2009
11 oct. 2007 à 20:53
pfff... là, j'assure vraiment pas...

<hr />I love .net
0
Rejoignez-nous