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 27/09/2010, 18h08   #1
jurassic pork
Membre chevronné
 
Avatar de jurassic pork
 
Bidouilleur
Inscription : décembre 2008
Messages : 379
Détails du profil
Informations professionnelles :
Activité : Bidouilleur

Informations forums :
Inscription : décembre 2008
Messages : 379
Points : 769
Points : 769
Par défaut Récupération des touches clavier enfoncées dans d'autres applications

Bonjour,

Pour récupérer les touches clavier enfoncées dans d'autres applications, il faut utiliser ce qu'on appelle un hook clavier et pour cela utiliser des API Windows. Voici un petit exemple d'exploitation en windev.
Dans un premier temps il faut déclarer quelques constantes et structures dans le code du projet (initialisation du projet) :
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
CONSTANTE
HC_ACTION=0//0
VK_SHIFT=16
WH_JOURNALRECORD = 0
WH_JOURNALPLAYBACK = 1
WH_KEYBOARD = 2
WH_GETMESSAGE = 3
WH_CALLWNDPROC = 4
WH_CBT = 5
WH_SYSMSGFILTER = 6
WH_MOUSE = 7
WH_HARDWARE = 8
WH_DEBUG = 9
WH_SHELL = 10
WH_FOREGROUNDIDLE = 11
WH_CALLWNDPROCRET = 12
WH_KEYBOARD_LL = 13
WH_MOUSE_LL = 14
WM_KEYDOWN=256//0x0100

FIN
KBDLLHOOKSTRUCT est une structure
vkCode est un entier
scanCode est un entier
flags est un entier
Time est un entier
dwExtraInfo est un entier
FIN
gnHandleHook est un entier // handle du hook
ensuite pour mettre en oeuvre le hook il faut un code du genre :
Code :
1
2
gnHandleHook = API("User32", "SetWindowsHookExA", WH_KEYBOARD_LL, &Procédure_Hookeuse, Instance(), 0)

pour terminer de hooker le clavier un code du type:
Code :
1
2
3
4
SI PAS API("user32","UnhookWindowsHookEx",gnHandleHook) ALORS
    Erreur("erreur de désinstallation du hook ")
    FIN
et voici pour terminer un exemple de procédure de hook qu'il faudra déclarer comme procédure globale
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
PROCEDURE Procédure_Hookeuse(ncode,wparam,lparam)
clavier est un KBDLLHOOKSTRUCT
KeyState est un tableau fixe de 256 entiers sans signe sur 1 octet
MonCharEx est un tableau fixe de 2 caractères
RetourFonction est un entier
vk est un entier sans signe
//MonChar est un caractère
keylayout est un entier 
tailleChar est un entier
x est un entier

SI ncode = HC_ACTION ALORS
// Sur touche enfoncé uniquement
	SI  wparam <> WM_KEYDOWN  ALORS
    	RENVOYER API("user32","CallNextHookEx",gnHandleHook, ncode, wparam, lparam) 
  FIN
Transfert(&clavier,lparam,Dimension(clavier)) // transfert de la structure ( méthode peu recommandable avez-vous mieux ? cast?)
keylayout=API("USER32","GetKeyboardLayout",0)
RetourFonction=API("USER32","GetKeyboardState",&KeyState)
vk = API("USER32","MapVirtualKeyExA",clavier:scanCode,1,keylayout)
// on place l'état de la touche Shift dans le tableau des états des touches
KeyState[VK_SHIFT +1]= ETBinaire((API("USER32","GetAsyncKeyState",VK_SHIFT)/256),255)
//RetourFonction=API("USER32","ToAscii",clavier:vkCode,clavier:scanCode,&KeyState,&MonChar,0)
// on appelle ToAsciiEx plus balaise que ToAscii
tailleChar =API("USER32","ToAsciiEx",vk, clavier:scanCode,&KeyState,&MonCharEx, 0, keylayout)
	
POUR x = 1 A tailleChar
	Fenêtre1.Memo += MonCharEx[x] // Memo est un champ de saisie qui affiche les caractères tapés	
FIN

FIN

// Renvoie la suite du hook afin de permettre le traitement de l'appui par la fenetre d'origine
RENVOYER API("user32","CallNextHookEx",gnHandleHook, ncode, wparam, lparam)
Bien sûr, tout ceci n'est pas parfait, ce n'est qu'un début. Dans la procédure hookeuse il manque la gestion du AltGR, du CapsLock, du Return, du pavé numérique, etc...
Si quelqu'un rajoute des améliorations qu'il en fasse profiter tout le monde !

Ami calmant, J.P
jurassic pork est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/11/2010, 09h18   #2
jurassic pork
Membre chevronné
 
Avatar de jurassic pork
 
Bidouilleur
Inscription : décembre 2008
Messages : 379
Détails du profil
Informations professionnelles :
Activité : Bidouilleur

Informations forums :
Inscription : décembre 2008
Messages : 379
Points : 769
Points : 769
bonjour,
voici une amélioration du code précédent :
affichage titre application active.
gestion du return
gestion du pavé numérique
gestion du altgr ( sauf touches mortes)
code modifié 1 - dans le code du projet (initialisation du projet) :
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
CONSTANTE
HC_ACTION=0//0
WH_JOURNALRECORD = 0
WH_JOURNALPLAYBACK = 1
WH_KEYBOARD = 2
WH_GETMESSAGE = 3
WH_CALLWNDPROC = 4
WH_CBT = 5
WH_SYSMSGFILTER = 6
WH_MOUSE = 7
WH_HARDWARE = 8
WH_DEBUG = 9
WH_SHELL = 10
WH_FOREGROUNDIDLE = 11
WH_CALLWNDPROCRET = 12
WH_KEYBOARD_LL = 13
WH_MOUSE_LL = 14
WM_KEYDOWN=256//0x0100
WM_SYSKEYDOWN=260//0x0104
VK_RETURN=13	
VK_SHIFT=16
VK_CONTROL=17
VK_MENU=18
VK_NUMPAD0=96
VK_NUMPAD1=97
VK_NUMPAD2=98
VK_NUMPAD3=99
VK_NUMPAD4=100
VK_NUMPAD5=101
VK_NUMPAD6=102
VK_NUMPAD7=103
VK_NUMPAD8=104
VK_NUMPAD9=105
VK_NUMLOCK=144
VK_LMENU=164
VK_RMENU=165
FIN
KBDLLHOOKSTRUCT est une structure
vkCode     est un entier 
scanCode   est un entier
flags      est un entier
time       est un entier
dwExtraInfo est un entier
FIN
gnHandleHook est un entier // handle de la procédure de hook
FenêtreMémorisée est une chaîne
2 - dans la Procédure_Hookeuse
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
PROCEDURE Procédure_Hookeuse(ncode,wparam,lparam)
clavier est un KBDLLHOOKSTRUCT
KeyState est un tableau fixe de 256 entiers sans signe sur 1 octet
MonCharEx est un tableau fixe de 2 caractères
RetourFonction est un entier
vk est un entier sans signe
keylayout est un entier 
tailleChar est un entier
x est un entier
FenêtreCourante est une chaîne
Machaine est une chaîne


SI ncode = HC_ACTION ALORS
// Sur touche enfoncé uniquement
	SI  wparam <> WM_KEYDOWN  ET wparam <> WM_SYSKEYDOWN  ALORS
    	RENVOYER API("user32","CallNextHookEx",gnHandleHook, ncode, wparam, lparam) 
  FIN
	Transfert(&clavier,lparam,Dimension(clavier)) // transfert de la structure ( méthode peu recommandable avez-vous mieux ? cast?)
	FenêtreCourante = SysFenTitre (SysFenActive ())
	
	SI FenêtreCourante <> FenêtreMémorisée  ALORS
		FenêtreMémorisée = FenêtreCourante	
		Fenêtre1.Memo += RC + FenêtreMémorisée + "++++++++++++++++++++++++++" + RC
	FIN
keylayout=API("USER32","GetKeyboardLayout",0)
RetourFonction=API("USER32","GetKeyboardState",&KeyState)
vk = API("USER32","MapVirtualKeyExA",clavier:scanCode,3,keylayout)
KeyState[VK_SHIFT +1]= ETBinaire((API("USER32","GetAsyncKeyState",VK_SHIFT)/256),255)
KeyState[VK_MENU +1]= ETBinaire((API("USER32","GetAsyncKeyState",VK_CONTROL)/256),255)
KeyState[VK_CONTROL +1]= ETBinaire((API("USER32","GetAsyncKeyState",VK_CONTROL)/256),255)
// on appelle ToAsciiEx plus balaise de ToAscii
tailleChar =API("USER32","ToAsciiEx",vk, clavier:scanCode,&KeyState,&MonCharEx, 0, keylayout)
// gestion du return
	SI 	clavier:vkCode = VK_RETURN ALORS  	Fenêtre1.Memo += RC
POUR x = 1 A tailleChar
	Fenêtre1.Memo += MonCharEx[x] // Memo est un champ de saisie qui affiche les caractères tapés	
FIN
	SI tailleChar = 0 ALORS
		 Machaine = ""
		 SELON clavier:vkCode
			CAS	VK_NUMPAD0 : Machaine = "0"
			CAS	VK_NUMPAD1 : Machaine = "1"				
			CAS	VK_NUMPAD2 : Machaine = "2"
			CAS	VK_NUMPAD3 : Machaine = "3"
			CAS	VK_NUMPAD4 : Machaine = "4"
			CAS	VK_NUMPAD5 : Machaine = "5"
			CAS	VK_NUMPAD6 : Machaine = "6"
			CAS	VK_NUMPAD7 : Machaine = "7"
			CAS	VK_NUMPAD8 : Machaine = "8"
			CAS	VK_NUMPAD9 : Machaine = "9"		
		 FIN
		SI Machaine <> "" ALORS 	Fenêtre1.Memo += Machaine
	FIN

FIN
// Renvoie la suite du hook afin de permettre le traitement de l'appui par la fenetre d'origine
RENVOYER API("user32","CallNextHookEx",gnHandleHook, ncode, wparam, lparam)
Ami calmant, J.P
jurassic pork est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/11/2010, 10h22   #3
pixel016
Invité régulier
 
Inscription : septembre 2010
Messages : 106
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 106
Points : 5
Points : 5
Généralissime.

Mon sauveur

Merci beaucoup, très beau travail et belle contribution

Par contre dans ces modification la touche "Efface" n'efface pas réellement le caractère je crois.
pixel016 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 10h51   #4
alphabe2000
Invité de passage
 
Inscription : septembre 2003
Messages : 1
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 1
Points : 1
Points : 1
Envoyer un message via MSN à alphabe2000 Envoyer un message via Yahoo à alphabe2000
Tout est cool mais la variable Fenêtre1 génère des erreurs dans la prcédure_Hookeuse !
alphabe2000 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 10h45.


 
 
 
 
Partenaires

Hébergement Web