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
| 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_SansNom1.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)
// si le retour de ToAsciiEx est -1
SI tailleChar = -1 ALORS
// on mémorise l'état du clavier
ClavierMémorisé = clavier
ShiftMémorisé = KeyState[VK_SHIFT +1]
// on vide le buffer pour revenir à l'état précédent
TANTQUE API("USER32","ToAsciiEx",vk, clavier:scanCode,&KeyState,&MonCharEx, 0, keylayout) < 0
FIN
SINON
// gestion du return
SI clavier:vkCode = VK_RETURN ALORS FEN_SansNom1.Memo += RC
POUR x = 1 A tailleChar
FEN_SansNom1.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_SansNom1.Memo += Machaine
FIN
SI ClavierMémorisé:vkCode <> 0 ALORS
// A Faire : il serait plus sûr de réinitialiser le Keystate avec des zéros. A voir si bug
// on restitue l'état du shift
KeyState[VK_SHIFT +1] = ShiftMémorisé
// on renvoie l'ancien vkcode vers le buffer local
API("USER32","ToAsciiEx",ClavierMémorisé:vkCode, ClavierMémorisé:scanCode,&KeyState,&MonCharEx, 0, keylayout)
// on met le vkcode à zéro pour invalider le ClavierMémorisé
ClavierMémorisé:vkCode = 0
FIN
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) |
Partager