Soutenez-nous
Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Membre régulier
    Inscrit en
    août 2005
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : août 2005
    Messages : 63
    Points : 85
    Points
    85

    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 :
    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 :
    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 :
    1
    2
    API("user32","UnhookWindowsHookEx",iHook)
    Dans le code de la fonction MouseEvent locale à la fenêtre "maFenetre" :

    Code :
    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 régulier
    Inscrit en
    août 2005
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : août 2005
    Messages : 63
    Points : 85
    Points
    85

    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 :
    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 :
    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 :
    1
    2
    3
    4
    5
    iX   = PoidsFaible(CurseurPos(cpEcran))
    iY   = PoidsFort(CurseurPos(cpEcran))
    
    SimuleMouseEvent(::WM_LBUTTONDBLCLK,iX,iY)
    Bonne prog

  3. #3
    Invité de passage
    Inscrit en
    mars 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : mars 2011
    Messages : 7
    Points : 4
    Points
    4

    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???

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •