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

MFC Discussion :

Probleme de Hook souris


Sujet :

MFC

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut Probleme de Hook souris
    salut a tous,

    je vien d'implementer un hook pour intercepter tout les evenements souris de mon application. pour cela j'ai utiliser la faq et la msdn et j'arrive a ceci:

    .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    HHOOK MouseHookHandle;
    LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam);
    .cpp:
    dans OnInitDialog:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    BOOL CIHMListeDlg::OnInitDialog() 
    {
    	.......
     
     
    	MouseHookHandle = SetWindowsHookEx(WH_MOUSE, 
                         (HOOKPROC)MouseProc, 
                         (HINSTANCE) NULL, 
    	             GetCurrentThreadId()); 
     
     
    	return TRUE;  // return TRUE unless you set the focus to a control
    	              // EXCEPTION: OCX Property Pages should return FALSE
    }
    et le contenu de ma fonction du hook:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    	// On joue un son à chaque fois que l'utilisateur enfonce le bouton gauche
         if (wParam == WM_LBUTTONDOWN)
    	      MessageBeep(MB_OK);
    	 return CallNextHookEx(MouseHookHandle,nCode,wParam,lParam);
    }
    seulement j'obtien deux erreurs:
    error C2440: 'type cast' : cannot convert from '' to 'long (__stdcall *)(int,unsigned int,long)'
    qui pointe vers l'appel de SetWindowsHookEx() et plus particulierment sur et
    error C2065: 'MouseHookHandle' : undeclared identifier
    qui pointe sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return CallNextHookEx(MouseHookHandle,nCode,wParam,lParam);
    je ne comprend pas, quesqu'y cloche???

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    une callback dans une classe ne doit pas etre déclarée en static ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    ok je vien de la declarer en static, j'ai une erreur en moins merci
    mais pkoi il ne trouve pas ma variable membre dans la fonction callback ???

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    et bien parce que si elle est static, elle ne peut pas etre utilisée dans la classe, donc elle n'accède pas aux variables membres.

    Pour ce faire, il faudrait déclarer la callback comme CIHMListeDlg::MouseProc ; mais ce ne peut plus etre static ...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    oui et dans ce cas je me retrouve avec ma premiere erreur.

    je vien de voir que dans l'exemple de la msdn, cette variable elle est global!!!
    je crois que je vais devoir faire pareil et moi qui avais reussi a limiter l'utilisation de variables globales... bon j'ai pas le choix me semble-t-il!

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    bon je l'ai passé en globale, ca compile mais j'ai une erreur au link:
    Linking...
    IHMListeDlg.obj : error LNK2001: unresolved external symbol "public: static long __stdcall CIHMListeDlg::MouseProc(int,unsigned int,long)" (?MouseProc@CIHMListeDlg@@SGJHIJ@Z)
    Debug/IHM.exe : fatal error LNK1120: 1 unresolved externals
    ca peu venir de quoi ca??

  7. #7
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    peut-on voir ce qu'il en est du .h et du .cpp maintenant ?

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public:
    	static LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam);
    	CMyListBox *pmyListBox;
    .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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    HHOOK MouseHookHandle;
     
    BOOL CIHMListeDlg::OnInitDialog() 
    {
    	CString s1;
    	CDialog::OnInitDialog();
     
     
    .................
     
     
    	MouseHookHandle = SetWindowsHookEx(WH_MOUSE, 
                         (HOOKPROC)MouseProc, 
                         (HINSTANCE) NULL, 
    					 GetCurrentThreadId()); 
     
     
    	return TRUE;  // return TRUE unless you set the focus to a control
    	              // EXCEPTION: OCX Property Pages should return FALSE
    }
     
     
    //////////////////////////////////////////////////////////////////////////////////////
    static LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    	// On joue un son à chaque fois que l'utilisateur enfonce le bouton gauche
         if (wParam == WM_LBUTTONDOWN)
    	      MessageBeep(MB_OK);
    	 return CallNextHookEx(MouseHookHandle,nCode,wParam,lParam);
     
    }

  9. #9
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    pourquoi faire une hook au niveau de la dialogue pour intercepter le message
    WM_LBUTTONDOWN ?
    c'est l'artillerie lourde pour ecraser la mouche non ?
    pourquoi ne pas intercepter directement avec classwizard le message en question qui genera le message de reponse en rapport ?
    j'ai loupé quelque chose ?


  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    parceque si mon pointeur de souris clic sur le coin en haut a droite de la list box et non dans la listbox, aucun evenement n'est intercepté par ma fonction PreTranslateMessage(MSG* pMsg)
    ma list doit reagir a tout clic de souris (aussi bien dans ma liste que a coter)

  11. #11
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    re,
    je vois pas ou est le pb ,tu interceptes le messages par classwizard sur la dialogue .
    ça fonctionne.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    bon je vai re-éssayer alors de faire comme tu dis

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    bon ok, je comprend pourkoi tu souhaite que je fasse comme ca.

    ma listbox elle est dans une dialog mais elle prend tout l'affichage.
    elle va de (0,0) jusqu'a (640,480).
    seulement pour eviter l'utilisation de la souris je cache le curseur et je lui dis de rester sur (0,0).
    or ce point 0 correspond au coin de ma listbox puisqu'elle prend toute la fenetre.
    seulement si je clic, je ne clic pas "dans" ma listbox et l'evenement n'est intercepter null par. ni par ma dialogue ni par ma list. pour que ca marche je suis obliger de cliquer soit dans la list soit sur la dialogue.
    ces 2 chose sont helas impossible car:
    je ne peu pas cliquer sur la dialogue car elle est derriere la listbox
    je ne peu pas clique dans la listbox car sinon la selection est modifiée pour se mettre sur le string du clic.

    tu comprend?
    bon je suis partit sur cette methode mais je ne sais pas si c'est une bonne idée.
    donc j'essai d'attraper TOUS les evenement souris pour contourner le probleme.

    je sais c'est franchement bizard comme appli mais je crée une listbox qui réagi au comportment de l'utilisateur sur sa souris

  14. #14
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    c'est un objet mutant ta listbox

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    lol oui,
    en gros elle regroupe:
    affichage perso
    deplacement de la selection perso
    affichage d'image
    réaction en fonction des action utilisateur (clavier souris)

    donc faut absolument que je fasse marcher ce hook ca me simplifiera pas mal la tache car la je traite le OnSelchange, le pretranslate.... ca devien tres lourd

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    bon j'ai virer cette erreur, le hook marche... mais le probleme est toujour là!!!!
    si je clic dans la listbox ca marche mais si je clic sur un coin ou meme sur une fleche de l'ascenseur je n'intercepte aucun evenement...

    mais c'est pas possible je vais finir par me taper la tete contre l'ecran

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    :trouve: une technique de
    ma listbox je la fait a peine plus petite que ma dialogue donc on a un bandeau vertical de 2 pixels de ma dialogue visible sur la gauche...
    et là je bloc le curseur de ma souris avec ClipCursor(..) dans un pixel de ce bandeau.
    puis comme ca je peu intercepter les evenement souris....

    c'est-y pas une solution de




  18. #18
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    n'empeche, le hook souris, s'il est bien fait, devrait intercepter tous les clicks souris de ton process.

    Au pire, tu peux faire un hook global (dans une dll) qui vérifie qu'elle est bien dans le bon processus, comme ca, elle interceptera tout

Discussions similaires

  1. Java natif & hook souris Windows
    Par ®om dans le forum Langage
    Réponses: 1
    Dernier message: 18/07/2006, 22h39
  2. Problème disque sata + souris optique
    Par elalaoui.omar dans le forum Matériel
    Réponses: 8
    Dernier message: 11/07/2006, 23h53
  3. Problème curseur de souris
    Par Krispy dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 07/07/2006, 15h07
  4. Problème avec la souris
    Par trotters213 dans le forum Matériel
    Réponses: 2
    Dernier message: 27/05/2006, 16h43
  5. Problème avec la souris
    Par Zay dans le forum Matériel
    Réponses: 5
    Dernier message: 13/01/2006, 18h55

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