IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

Windev : Intercepter un évènement Windows : La souris


Sujet :

Contribuez

  1. #1
    Membre actif
    Inscrit en
    Août 2005
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 96
    Points : 205
    Points
    205
    Par défaut Windev : Intercepter un évènement Windows : La souris
    Voici comment récupérer les actions exécutées par la souris sur n'importe quelle fenêtre Windows (à la différence de la fonction Windev "Evénement" qui n'est active que sur les fenêtres Windev) :

    Dans les déclarations globales de la fenêtre "maFenetre" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CONSTANTE
    	WH_MOUSE_LL = 14
    	WM_LBUTTONDOWN = 513
    	WM_LBUTTONUP = 514
    	WM_RBUTTONDOWN = 516
    	WM_RBUTTONUP = 517
    	WM_MOUSEMOVE = 512
    	WM_MOUSEWHEEL = 522
    FIN
     
    iHook est un entier système = 0
    Dans le code d'initialisation de la fenête "maFenetre" :

    On crée un "Hook" Windows :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    iHook = API("user32","SetWindowsHookExA",WH_MOUSE_LL,&MouseEvent,Instance(),0)
    Dans le code de fermeture de la fenête "maFenetre" :

    On détruit le "Hook" Windows :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    API("user32","UnhookWindowsHookEx",iHook)
    Dans le code de la fonction MouseEvent locale à la fenêtre "maFenetre" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    PROCEDURE MouseEvent(iIdHook est un entier,wParam est un entier,iLParam est un entier)
     
    SELON wParam
     
    	//Bouton gauche enfoncé
    	CAS WM_LBUTTONDOWN	//513
     
    		Trace("Bouton gauche enfoncé")
     
                    //Récupérer le handle de la fenêtre Windows cliquée
    		strPOINT est une structure
    			x est un entier
    			y est un entier
    		FIN
     
    		stPoint est une strPOINT
    		stPoint.x = PoidsFaible(CurseurPos(cpEcran))
    		stPoint.y = PoidsFort(CurseurPos(cpEcran))
     
    		iHandle est un entier système
    		iHandle = API("USER32","WindowFromPoint",stPoint)
     
    		Trace(iHandle+" | "+SysFenTitre(iHandle))
     
    	//Bouton gauche relaché
    	CAS WM_LBUTTONUP	//514
    		Trace("Bouton gauche relaché")
     
    	//Bouton droit enfoncé
    	CAS WM_RBUTTONDOWN	//516
    		Trace("Bouton droit enfoncé")
     
    	//Bouton droit relaché
    	CAS WM_RBUTTONUP//517
    		Trace("Bouton droit relaché")
     
    	//Déplacement souris
    	CAS WM_MOUSEMOVE	//512
    		Trace("Déplacement souris")
     
    	//Roulette souris
    	CAS WM_MOUSEWHEEL	//522
    		Trace("Roulette souris")		
    FIN
    Bonne prog

  2. #2
    Membre actif
    Inscrit en
    Août 2005
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 96
    Points : 205
    Points
    205
    Par défaut Windev : Simuler l'utilisation de la souris avec mouse_event
    J'ajoute qu'à l'inverse, il est possible de simuler un évènement souris avec la fonction de l'api Windows mouse_event.

    Cela permet d'aller plus loin que les fonctions de pilotage de la souris de Windev qui ne permettent pas d'exécuter des actions sur des champs autres que Windev :
    http://doc.pcsoft.fr/fr-FR/?10000090...ouris-fonction

    Les constantes nécessaires, à copier dans les déclarations globales d'une fenêtre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    CONSTANTE
    	WH_MOUSE_LL = 14
     
    	WM_LBUTTONDOWN = 513
    	WM_LBUTTONUP = 514
    	WM_LBUTTONDBLCLK = 515
     
    	WM_RBUTTONDOWN = 516
    	WM_RBUTTONUP = 517
    	WM_RBUTTONDBLCLK = 518
     
    	WM_MBUTTONDOWN = 519
    	WM_MBUTTONUP = 520
    	WM_MBUTTONDBLCLK = 521
     
    	WM_MOUSEMOVE = 512
    	WM_MOUSEWHEEL = 522
     
    	MK_LBUTTON = 1
     
    	MOUSEEVENTF_ABSOLUTE=32768//0x8000 
     
    	MOUSEEVENTF_LEFTDOWN=2//0x0002 
    	MOUSEEVENTF_LEFTUP=4//0x0004 
     
    	MOUSEEVENTF_RIGHTDOWN=8//0x0008 
    	MOUSEEVENTF_RIGHTUP=16//0x0010 
     
    	MOUSEEVENTF_MIDDLEDOWN=32//0x0020 
    	MOUSEEVENTF_MIDDLEUP=64//0x0040 
     
    	MOUSEEVENTF_MOVE=1//0x0001 
     
    	MOUSEEVENTF_WHEEL=2048//0x0800
    	MOUSEEVENTF_HWHEEL=4096//0x1000 
     
    	MOUSETRAILS=39//39
    	MOUSE_EVENT=2//0x0002 
    	MOUSE_MOVED=1//0x0001
     
    	XBUTTON1 = 1
    	XBUTTON2 = 2	
    FIN
    La procédure locale SimuleMouseEvent(iEvent,iX,iY) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    PROCEDURE SimuleMouseEvent(_iEvent est un entier,_iX est un entier,_iY est un entier)
     
    iResX est un entier
    iResY est un entier
     
    iResX = SysXRes()
    iResY = SysYRes()
     
    rCoefX est un réel
    rCoefY est un réel
     
    rCoefX = 65535/iResX
    rCoefY = 65535/iResY
     
    _iX = _iX*rCoefX
    _iY = _iY*rCoefY
     
    SELON _iEvent
     
    	CAS ::WM_LBUTTONDOWN
     
    		AppelDLL32("user32","mouse_event",::MOUSEEVENTF_LEFTDOWN,_iX,_iY,0,0)
     
    	CAS ::WM_LBUTTONUP
     
    		AppelDLL32("user32","mouse_event",::MOUSEEVENTF_LEFTUP,_iX,_iY,0,0)
     
    	CAS ::WM_LBUTTONDBLCLK
     
    		AppelDLL32("user32","mouse_event",::MOUSEEVENTF_LEFTDOWN,_iX,_iY,0,0)
    		AppelDLL32("user32","mouse_event",::MOUSEEVENTF_LEFTUP,_iX,_iY,0,0)
     
    		AppelDLL32("user32","mouse_event",::MOUSEEVENTF_LEFTDOWN,_iX,_iY,0,0)
    		AppelDLL32("user32","mouse_event",::MOUSEEVENTF_LEFTUP,_iX,_iY,0,0)
     
    	CAS ::WM_RBUTTONDOWN
     
    		AppelDLL32("user32","mouse_event",::MOUSEEVENTF_RIGHTDOWN,_iX,_iY,0,0)
     
    	CAS ::WM_RBUTTONUP
     
    		AppelDLL32("user32","mouse_event",::MOUSEEVENTF_LEFTUP,_iX,_iY,0,0)
     
    	CAS ::WM_RBUTTONDBLCLK
     
    		AppelDLL32("user32","mouse_event",::MOUSEEVENTF_RIGHTDOWN,_iX,_iY,0,0)
    		AppelDLL32("user32","mouse_event",::MOUSEEVENTF_LEFTUP,_iX,_iY,0,0)
     
    		AppelDLL32("user32","mouse_event",::MOUSEEVENTF_RIGHTDOWN,_iX,_iY,0,0)
    		AppelDLL32("user32","mouse_event",::MOUSEEVENTF_LEFTUP,_iX,_iY,0,0)
     
    	CAS ::WM_MBUTTONDOWN
     
    		AppelDLL32("user32","mouse_event",::MOUSEEVENTF_MIDDLEUP,_iX,_iY,0,0)
     
    	CAS ::WM_MBUTTONUP
     
    		AppelDLL32("user32","mouse_event",::MOUSEEVENTF_MIDDLEDOWN,_iX,_iY,0,0)
     
    	CAS ::WM_MBUTTONDBLCLK
     
    		AppelDLL32("user32","mouse_event",::MOUSEEVENTF_MIDDLEUP,_iX,_iY,0,0)
    		AppelDLL32("user32","mouse_event",::MOUSEEVENTF_MIDDLEDOWN,_iX,_iY,0,0)
     
    		AppelDLL32("user32","mouse_event",::MOUSEEVENTF_MIDDLEUP,_iX,_iY,0,0)
    		AppelDLL32("user32","mouse_event",::MOUSEEVENTF_MIDDLEDOWN,_iX,_iY,0,0)
     
    	CAS ::WM_MOUSEMOVE	
     
    		_iX   = PoidsFaible(CurseurPos(cpEcran ))
    		_iY   = PoidsFort(CurseurPos(cpEcran ))
     
    		AppelDLL32("user32","SetCursorPos",_iX,_iY)
     
    	CAS ::WM_MOUSEWHEEL
     
    		AppelDLL32("user32","mouse_event",::MOUSEEVENTF_WHEEL,0,0,_iNb,0)
    FIN
    Et son appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    iX   = PoidsFaible(CurseurPos(cpEcran))
    iY   = PoidsFort(CurseurPos(cpEcran))
     
    SimuleMouseEvent(::WM_LBUTTONDBLCLK,iX,iY)
    Bonne prog

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Merci a toi pour ce code impecable.....

    Je me demande quand meme pourquoi PcSoft ne fait pas une fonction "EvenementGlobal" avec ce code dedans???

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/10/2013, 23h40
  2. Intercepter les événements souris
    Par FredericB dans le forum Composants FMX
    Réponses: 2
    Dernier message: 09/06/2013, 07h23
  3. Intercepter l'écriture dans le journal d'événement windows
    Par lejert dans le forum API, COM et SDKs
    Réponses: 0
    Dernier message: 18/04/2013, 10h51
  4. Intercepter un Message Windows ? Créer un Composant Grille !
    Par TOTO32 dans le forum Composants VCL
    Réponses: 6
    Dernier message: 21/07/2004, 13h41
  5. Réponses: 2
    Dernier message: 06/04/2004, 08h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo