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 :

Récupération des touches clavier enfoncées dans d'autres applications


Sujet :

Contribuez

  1. #1
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    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 : 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
     
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
     
    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 computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  2. #2
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    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 : 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
     
    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 : 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
     
    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 computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 223
    Points : 47
    Points
    47
    Par défaut
    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.

  4. #4
    Futur Membre du Club
    Inscrit en
    Septembre 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    Tout est cool mais la variable Fenêtre1 génère des erreurs dans la prcédure_Hookeuse !
    stl tout le monde je suis noir et on dit que je suis comme Arnold swarze..... de terminator pour décrire mon physique ,j'ai 24 ans

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 7
    Points : 10
    Points
    10
    Par défaut
    Bonjour
    je déterre le sujet car je voudrais me servir de ce bout de code
    mais voila je ne trouve pas qu'elle valeur mettre

    Procédure_Hookeuse(ncode,wparam,lparam)

    pour l'appel a la procédure je coince :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gnHandleHook = API("User32", "SetWindowsHookExA", WH_KEYBOARD_LL, &Procédure_Hookeuse, Instance(), 0)
    ncode = ?
    wparam = ?
    lparam = ?

    si une âme charitable pouvais m'aider

    Merci par avance

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Février 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Février 2016
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour, personnellement je cherchais a récupérer quand mon utilisateur faisait la combinaison CTRL+Click Droit afin de copier le presse papier dans une zone particulière, j'ai fini par trouver, cela devrait t'aider et surtout est beaucoup plus court que le code de notre ami Jurrasik :

    Dans l'initialisation du programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CONSTANTE
    	VK_RBUTTON = 2 //hexa 02
    	VK_CONTROL = 17 // hexa 11
    FIN
    Tu trouvera les valeur que tu cherche sur ce lien : http://lesouriciergris.free.fr/winprog/virtualkey.pdf

    dans une procédure (chez moi Touche) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PROCEDURE touche()
    nTouche1,nTouche2 est un entier
    nTouche1=API("USER32","GetAsyncKeyState",VK_CONTROL)
    nTouche2=API("USER32","GetAsyncKeyState",VK_RBUTTON)
    SI nTouche1=32768 AND nTouche2=32768 ALORS //32768 corresponds à touche appuyée (ou activée)
    	// mettre ici le traitement a faire si les touche ont été appuyées.
    FIN
    Puis dans l'initialisation de la fenêtre principale du programme, j'ai rajouté un timer qui appelle la procédure :
    Voila en espérant que cela puisse t'aider.

Discussions similaires

  1. Gestion des touches clavier
    Par bourinator dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 18/06/2006, 16h19
  2. récupération des id non présente dans une CIF
    Par Zen_Fou dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/04/2006, 12h00
  3. [Conception] récupération d'une variable php dans une autre page
    Par vali7 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 18/01/2006, 11h19
  4. Réponses: 8
    Dernier message: 12/05/2005, 08h16
  5. [JEditorPane]Captures des touches claviers
    Par splend_f dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 17/05/2004, 14h57

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