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

Langage C++ Discussion :

Problème à la création d'une classe pour gérer le Hook


Sujet :

Langage C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 98
    Points : 57
    Points
    57
    Par défaut Problème à la création d'une classe pour gérer le Hook
    Bonjour,
    Je voudrais construire une classe qui puisse initialiser un Hook et tout un tas d'autre choses, de manière à pouvoir la réutiliser dans mes applis par la suite.
    Le problème est que quand je met ce code dans le main:

    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
    #include <QtCore/QCoreApplication>
    #include <QDebug>
    #include <Windows.h>
     
    HHOOK hHook = NULL;
     
    using namespace std;
    LRESULT CALLBACK MyLowLevelKeyBoardProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
        qDebug() << "Test Clavier!";
        return CallNextHookEx(hHook, nCode, wParam, lParam);
    }
     
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
     
        hHook = SetWindowsHookEx(WH_KEYBOARD_LL, MyLowLevelKeyBoardProc, NULL, 0);
        if(hHook == NULL)
            qDebug() << "Hook failed !";
     
        return a.exec();
    }
    tout fonctionne bien, alors que quand je veut le créer dans une classe (avec séparation conventionelle dans le .h et .cpp ça bloque.

    Voici mon .h:

    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
     
    #ifndef LOWLEVELHOOK_H
    #define LOWLEVELHOOK_H
     
    #include <QtCore>
    #include <Windows.h>
    #include <QDebug>
     
    class LowLevelHook : public QObject
    {
        Q_OBJECT
     
    public:
        LowLevelHook();
     
    private:
        // Attributs:
        HHOOK hookClavier;
     
        // Méthodes:
        LRESULT CALLBACK MyLowLevelKeyBoardProc(int nCode, WPARAM wParam, LPARAM lParam);
     
    };
     
    #endif // LOWLEVELHOOK_H
    Et mon .cpp:

    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
     
    #include "lowlevelhook.h"
     
    LowLevelHook::LowLevelHook() : hookClavier(NULL)
    {
        hookClavier = SetWindowsHookEx(WH_KEYBOARD_LL, MyLowLevelKeyBoardProc, NULL, 0);
        if(hookClavier == NULL)
            qDebug() << "Hook Clavier Failed !";
    }
     
    LRESULT LowLevelHook::MyLowLevelKeyBoardProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
        qDebug() << "Test Clavier!";
     
        return CallNextHookEx(hookClavier, nCode, wParam, lParam);
    }
    Erreur sur la ligne 6 du .cpp:

    error: argument of type 'LRESULT (LowLevelHook::)(int, WPARAM, LPARAM)' does not match 'LRESULT (*)(int, WPARAM, LPARAM)'

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Citation Envoyé par compileur
    error: argument of type 'LRESULT (LowLevelHook:(int, WPARAM, LPARAM)' does not match 'LRESULT (*)(int, WPARAM, LPARAM)'
    C'est un problème de statisme.
    tu dois donner un pointeur de fonction à SetWindowsHookEx(), hors, tu donne un pointeur de fonction membre.

    Si f est un void (*)(int), alors f(1); est un appel valable
    Au contraire, si f est un void (C::*)(int), alors f(1); n'est pas un appel valable, parce que f est utilisable sur un objet du type C (ou héritier).

    Ici, tu peux envisager soit hookClavier = SetWindowsHookEx(WH_KEYBOARD_LL, this->MyLowLevelKeyBoardProc, NULL, 0);, soit de rendre MyLowLevelKeyBoardProc statique, mais tu y perds tout l'intéret.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 98
    Points : 57
    Points
    57
    Par défaut
    Bonjour et merci pour ta réponse,
    Pour ce qui est de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hookClavier = SetWindowsHookEx(WH_KEYBOARD_LL, this->MyLowLevelKeyBoardProc, NULL, 0);
    ça ne fonctionne pas, ça me donne exactement la même erreur.
    Et comme tu le dis, en rendant statique MyLowLevelKeyBoardProc je perd tout l'intérêt et ça implique pas mal de modifications derrière.

    C'est quelque chose que j'ai réussit a faire sans trop de problèmes en C# mais là pour le coups, je suis complètement bloqué

    Est ce qu'il n'y a aucune autre solution ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 98
    Points : 57
    Points
    57
    Par défaut
    Bon, j'ai essayé de mettre MyLowLevelKeyBoardProc en static, mais du coups il n'accepte plus le hookClavier dansl e return, et si je le met aussi en static, ça me fais une belle série d'erreurs.

    J'ai essayé de faire une fonction à l'extérieur de la classe, mais il y a un problème avec le hookClavier, je ne sais vraiment plus comment faire, quelqu'un à une solution svp je suis vraiment bloqué
    Merci d'avance !

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    J'ai bien peur que tu aies besoin d'une variable globale/statique/singleton pour relier les données de ton hook à la fonction (qui elle, doit être statique pour être acceptée par SetWindowsHookEx()).

    Personnellement, j'envisagerais une classe mère template CRTP pour gérer le static/singleton, et faire le lien entre la fonction statique et celle réimplémentée dans la classe fille (virtuelle ou CRTP).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Organiser une classe pour gérer les images d'un site
    Par Renand dans le forum Performance Web
    Réponses: 5
    Dernier message: 02/09/2011, 11h38
  2. création d'une classe pour une table
    Par asma07 dans le forum C#
    Réponses: 3
    Dernier message: 19/10/2009, 17h00
  3. Coder une classe pour gérer les matrices
    Par TrexXx dans le forum Débuter
    Réponses: 2
    Dernier message: 11/02/2009, 13h22
  4. Réponses: 0
    Dernier message: 12/08/2008, 17h12
  5. Réponses: 2
    Dernier message: 04/05/2007, 14h10

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