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

C++ Discussion :

Hook clavier récupérer vkCode


Sujet :

C++

  1. #1
    Membre confirmé Avatar de racine carrée
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 156
    Par défaut Hook clavier récupérer vkCode
    Bonjour à tous,
    j'ai créé le code suivant pour installer un hook global bas niveau sur le clavier, mais je n'arrive pas à récupérer l'info sur la touche qui a été pressée.
    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
    #include <Windows.h>
    #include <iostream>
    using namespace std;
    HHOOK mouseHook;
     
    LRESULT __stdcall hookCallBack(int nCode, WPARAM wParam, LPARAM lParam)
    {
        cout<<lParam->vkCode<<endl;
        return CallNextHookEx(NULL,nCode,wParam,lParam);
    }
     
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        if (!(mouseHook = SetWindowsHookEx(WH_KEYBOARD_LL, hookCallBack, NULL, 0)))
        {
            cout << "Failed to install mouse hook!" << endl;
        }
        MSG msg;
        while (GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        UnhookWindowsHookEx(mouseHook);
        return msg.wParam;
    }
    D'après la documentation de microsoft sur la fonction de callback LowLevelKeyboardProc, le paramètre wParam indique l'action de la touche (wm_keydown, ...) et le paramètre lParam est un pointeur vers une structure KBDLLHOOKSTRUCT .
    Cependant la ligne lParam->vkCode ne compile pas et j'ai l'erreur

    === Build: Release in clavier (compiler: GNU GCC Compiler) ===
    clavier\main.cpp In function 'LRESULT hookCallBack(int, WPARAM, LPARAM)':
    clavier\main.cpp 11 error: base operand of '->' is not a pointer
    === Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===

    qui me dit que lParam n'est pas un pointeur (et d'ailleurs il me semble que lParam est un entier qui vaut 7142884). Avez-vous une idée de pourquoi cela, et de comment récupérer le vkCode (sans devoir faire appel à une fonction du style GetAsyncKeyState) ?

    Merci d'avance !

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    Sous Windows LPARAM est un type entier (long long chez moi).
    Donc il a certainement pas de membre et encore moins d'utilisation de ->.
    Vu que ça représente un pointeur d'après la doc, et en fait son adresse, il faut d'abord extraire le pointeur.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre confirmé Avatar de racine carrée
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 156
    Par défaut
    Bonsoir et merci beaucoup pour cette réponse,
    j'ai donc résolu le problème en remplaçant le contenu de ma fonction HookCallBack par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    KBDLLHOOKSTRUCT* p=reinterpret_cast<KBDLLHOOKSTRUCT*>(lParam);
    cout<<p->vkCode<<endl;
    Y a-t-il cependant une méthode plus propre qu'un reinterpret_cast, ou bien est-ce la méthode à utiliser ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    C'est la méthode à utiliser.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre confirmé Avatar de racine carrée
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 156
    Par défaut
    Merci beaucoup !
    Si je retourne true à la place de l'appel à la fonction CallNextHook, l'appui de la touche est bien ignoré (comme cela est expliqué dans la doc), mais si je veux modifier la touche qui a été appuyée (et non ignorer l'appui des touches) je n'y arrive point. Supposons par exemple que quelque soit la touche appuyée je veuille que la fenêtre cible reçoive le code de la touche 'a', je suis tenté d'utiliser ce code dans la fonction de callback:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    KBDLLHOOKSTRUCT* p=reinterpret_cast<KBDLLHOOKSTRUCT*>(lParam);
    p->vkCode=65;
    return CallNextHookEx(NULL,nCode,wParam,lParam);
    Pourtant cela n'a aucun effet. Est-ce normal ?

Discussions similaires

  1. [VB.NET] API hook clavier
    Par Torkan dans le forum Windows Forms
    Réponses: 15
    Dernier message: 05/05/2006, 03h01
  2. Réponses: 2
    Dernier message: 19/06/2005, 10h37
  3. hook clavier
    Par bou3 dans le forum Windows
    Réponses: 5
    Dernier message: 14/06/2005, 17h12
  4. Hook Clavier et changement de touche
    Par Fly_57 dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 09/08/2004, 19h42
  5. [Hook] Clavier Microsoft office keyboard
    Par merzhin dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 01/06/2004, 13h59

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