Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > WinDev > Contribuez
Contribuez Vos contributions pour la rubrique Windev : articles, cours, tutoriels, faq, comparatifs, tests, sources, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 23/06/2010, 12h35   #1
bastiencb
Membre régulier
 
Inscription : août 2005
Messages : 56
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 56
Points : 70
Points : 70
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
bastiencb est déconnecté   Envoyer un message privé Réponse avec citation 40
Vieux 23/04/2011, 10h57   #2
bastiencb
Membre régulier
 
Inscription : août 2005
Messages : 56
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 56
Points : 70
Points : 70
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
bastiencb est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/11/2012, 16h02   #3
nikoniko555
Invité de passage
 
Inscription : mars 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 7
Points : 4
Points : 4
Merci a toi pour ce code impecable.....

Je me demande quand meme pourquoi PcSoft ne fait pas une fonction "EvenementGlobal" avec ce code dedans???
nikoniko555 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 05h13.


 
 
 
 
Partenaires

Hébergement Web