Hook souris [Résolu]

Signaler
Messages postés
10
Date d'inscription
samedi 31 mars 2007
Statut
Membre
Dernière intervention
24 octobre 2008
-
Messages postés
10
Date d'inscription
samedi 31 mars 2007
Statut
Membre
Dernière intervention
24 octobre 2008
-
Bonjours à tous.

Je cherche à recupèrer le click gauche de ma souris n'importe ou sur l'écrant et dans n'importe quel application,
d'après ce que j'ai compris sa fonctionne avec un "hook" mais je comprend pas trop, j'ai besoin d'un exemple genre :

Affiche un message MessageBox "click gauche appuyer !!!" dès que le click gauche a été pressé.

Je sais ya un exemple sur un autre post mais je ne le comprend pas ^^.


merci

10 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
32
Salut, il y a aussi des exemples de hook pour la souris sur CSharpFr

>> http://www.csharpfr.com/forum/sujet-EVENEMENT-IMPORTE-SUR-ECRAN_745061.aspx

Et un exemple sans installer de hook :

using System;
using System.Drawing;
using System.Windows.Forms;


// http://www.csharpfr.com/codes/LIBRAIRIE-RAWINPUT-NET_43573.aspx
using Wrapper.Windows.RawInput;


namespace RawHook
{
    internal class MainForm : Form
    {
        private bool draw = false;


        private MainForm( ) : base( )
        {
            this.Text = "Raw Hook";
            this.ClientSize = new Size( 96, 96 );
            this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
            this.StartPosition = FormStartPosition.Manual;
            this.Location = new Point( 0, 0 );
            this.TopMost = true;


            RawDevice.RegisterRawDevices( 0x01, 0x02, InputMode.BackgroundMode ); // Global hook.
            RawDevice.RawInput += new EventHandler< RawInputEventArgs >( RawDevice_RawInput );
        }


        private void RawDevice_RawInput( object sender, RawInputEventArgs args )
        {
            try
            {
                MouseData data = ( MouseData )args.GetRawData( );


                if ( data.ButtonState == MouseButtonState.LeftDown )
                {
                    draw = true;
                    this.Invalidate( this.ClientRectangle );
                    this.Update( );
                }
                if ( data.ButtonState == MouseButtonState.LeftUp )
                {
                    draw = false;
                    this.Invalidate( this.ClientRectangle );
                    this.Update( );
                }
            }
            catch
            {
                // ..
            }
        }


        protected override void OnPaint( PaintEventArgs args )
        {
            //base.OnPaint( args );


            Graphics g = args.Graphics;


            if ( draw )
                g.Clear( Color.Red );
            else
                g.Clear( this.BackColor );
        }


        protected override void Dispose( bool disposing )
        {
            RawDevice.UnregisterRawDevices( 0x01, 0x02 );
            base.Dispose( disposing );
        }


        [ STAThread ]
        private static void Main( )
        {
            Application.EnableVisualStyles( );
            Application.Run( new MainForm( ) );
        }
    }
}
Messages postés
10
Date d'inscription
samedi 31 mars 2007
Statut
Membre
Dernière intervention
24 octobre 2008

Zut, j'ai oublier un détail, J'aimerai que ce messagebox s'affiche si le click gauche est garder enfoncer ! si il est relaché le message disparaît.
Messages postés
357
Date d'inscription
jeudi 8 juin 2006
Statut
Membre
Dernière intervention
26 décembre 2011
3
Messages postés
357
Date d'inscription
jeudi 8 juin 2006
Statut
Membre
Dernière intervention
26 décembre 2011
3
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
49
xmox667> sur chaque poste tu mets toujours entre 2 et 4 messages ne possédant qu'un lien (poster à quelques minutes d'intervalles), possible de tous les regrouper dans un seul message?
Merci d'avance....

<hr />
-My Blog-
Messages postés
357
Date d'inscription
jeudi 8 juin 2006
Statut
Membre
Dernière intervention
26 décembre 2011
3
Salut Bidou,
Oui je vais les regrouper.
A+
Messages postés
10
Date d'inscription
samedi 31 mars 2007
Statut
Membre
Dernière intervention
24 octobre 2008

merci c'est parfait, me reste plus qu'a trouver comment simuler un click gauche de la souris maintenant.
Messages postés
10
Date d'inscription
samedi 31 mars 2007
Statut
Membre
Dernière intervention
24 octobre 2008

Lutinnoire j'ai un problème, j'ai remplacer ton rectange qui s'affiche en rouge par une simulation de click gauche quand le boutton gauche de la souris est "DOWN".

Alors sur windows il n'y a pas de soucis sa fonctionne mais dès que je lance un jeux genre battlefield 2 sa ne marche plus ^^ il ne click plus -.- et je ne suis même pas sur qu'il détect "data.ButtonState == MouseButtonState.LeftDown " .

Ma question est pourquoi ?

c'est parce qu'il ny a pas de hook ?

Bon but étant de faire un application pour éviter de cliquer comme un singler sur le bouton gauche de ma souris pour tirer en rafale dans le jeux, mais n'avoir besoin que de le laisser appuyer le boutton gauche  pour qu'il fasse les click tout seul ^^

merci.
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
32
Il est possible que pour un jeu ce soit différent, car les jeux utilisent souvent DirectInput. Peut être que le jeu capture la souris en mode "exclusif" et supprime les messages ( WM_* ) LeftDown, LeftUp etc..

Dans un premier temps laisse le carré rouge pour voir si l'appli détecte quelque chose, test aussi la valeur de data.RawButtonState à la place de LeftDown.

Sinon, ce genre de hook  >ICI< est relativement simple à mettre en place et ça semble marcher avec un jeu DirectX >ICI<
Messages postés
10
Date d'inscription
samedi 31 mars 2007
Statut
Membre
Dernière intervention
24 octobre 2008

J'ai repris ton code et ajouter sa  :

if ( data.ButtonState == MouseButtonState.LeftDown )
                {
                    Souris MonClick = new Souris();
                    draw = true;
                    this.Invalidate( this.ClientRectangle );
                    this.Update( );
                    MonClik.clique();
                }

///
///voici la classe Souris:
///



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;




namespace WindowsFormsApplication1
{
    public class Souris
    {
        [DllImport("User32.dll", SetLastError = true)]
        private static extern int SendInput(int nInputs, ref INPUT pInputs, int cbSize);




        public const int MOUSEEVENTF_LEFTDOWN = 0x0002;
        public const int MOUSEEVENTF_LEFTUP = 0x0004;       




        public struct INPUT
        {
            public int type;
            public MOUSEINPUT mi;
        }




        public struct MOUSEINPUT
        {
            public int dx;
            public int dy;
            public int mouseData;
            public int dwFlags;
            public int time;
            public int dwExtraInfo;
        }




        public void clique()
        {
            INPUT aInput = new Souris.INPUT();
            aInput.type = 0;
            aInput.mi.dwFlags = Souris.MOUSEEVENTF_LEFTDOWN;
            aInput.mi.dwExtraInfo = 0;
            aInput.mi.mouseData = 0;
            aInput.mi.time = 0;
            Souris.SendInput(1, ref aInput, Marshal.SizeOf(aInput));
            aInput.mi.dwFlags = Souris.MOUSEEVENTF_LEFTUP;
            Souris.SendInput(1, ref aInput, Marshal.SizeOf(aInput));
        }
    }
}

Sa ne marche pas comme je le souhaiterai si qqun a une idée ??
Sachant que le but et de simuler des cliques si la touche gauche de la souris est enfoncé et d'arreter les cliques dès quelle est relachée.