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

Windows Discussion :

[C] Des pros du hook ?


Sujet :

Windows

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 14
    Points : 11
    Points
    11
    Par défaut [C] Des pros du hook ?
    Bonjour,

    Je veux hooker un composant du type richeditbox (avec handle que j'appelerai hWnd_comp) ceci afin de récupérer les changements, tel que l'ajout de lignes de texte. Ce composant appartient donc a une fenetre parent (avec handle que j'appelerai hWnd_par) qui elle même correspond au processus a hooker et dont le PID est threadPID.

    J'ai vérifié (le PID de mon processus, handles ....) avec spy++ de microsoft pour savoir si je pointais bien avec les bonnes valeurs.


    J'ai donc une dll qui initialise le hook par

    msgHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC) getmsgHookProc,hDLL,threadPID);


    Au début et pour me simplifier, j'ai mis en dur (vu avec spy++) la valeur de threadPID. Les handles de la fenetres parents et du composant sont déterminés par FindWindow et EnumChildWindows .... (Cela est OK aussi et Valeurs confirmées avec spy++)

    Dans ma fonction de hook (getmsgHoocProc) je recupere les messages. Pour savoir si je rentrai bien dedans lorsque le composant richeditbox était modifié, j'ai mis un Beep(1000,2000); (Pour cela ca passe)

    Pour savoir quel message intercepter (ajout d'une ligne dans ma richeditbox), j'ai donc utilisé spy++. Apparement il faut que je récupére le message EM_REPLACESEL.

    Quand je fais un traitement des messages dans getmsgHoocProc, il ne semble pas le voir.
    J'ai mis aussi (pour voir) SendMessage (hWnd_comp, WM_GETTEXT, 128, (LPARAM)ch); avec ch tableau de char de taille 128
    mais mon tableau reste vide pensant qu'il allait me donner le contenu du richeditbox

    Quelqu'un pourrait il m'aider, je suis un peu perdu ????

    Merci d'avance

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 101
    Points : 59
    Points
    59
    Par défaut
    Salut,

    1)
    J'ai mis aussi (pour voir) SendMessage (hWnd_comp, WM_GETTEXT, 128, (LPARAM)ch);
    Essaille peut-etre un message du type " > WM_USER"

    2) Comment gère tu dans ton exe la boucle des messages ? Avec "GetMessage" et "LRESULT CALLBACK MainWndProc" ?

    Je n'ai peut être pas bien compris ton problème

    ++

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Des pros du hook ?
    Bonjour,

    Les fonctions pour le hook se trouve dans une DLL qu'il faut charger.

    Voila la fonction simplifié appelé par la fonction hook détournée. (Voir plus bas)

    void Logmsg(int code,WPARAM wParam,LPARAM lParam)
    { UINT toStop = ((MSG *)lParam)->message;

    if (toStop == EM_REPLACESEL)
    { MessageBox(NULL,"Texte recu","Pour info",MB_OK | MB_ICONINFORMATION);
    //((MSG *)lParam)->message = WM_NULL;
    }
    }


    Elle est appelé lors de message envoyé au thread avec identificateur theardPID

    msgHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC) getmsgHookProc,hDLL,threadPID);

    LRESULT CALLBACK getmsgHookProc(int code, WPARAM wParam, LPARAM lParam)
    { Logmsg(code,wParam,lParam);
    return CallNextHookEx(msgHook,code,wParam,lParam);
    }


    Dans Logmsg, ma gestion des messages me semble un peu simpliste, mais je ne voie pas comment récupérer le message qui m'interresse EM_RECPLACESEL

    Il doit me manquer des billes quand a la gestion des messages !!!!!


  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 101
    Points : 59
    Points
    59
    Par défaut
    Salut mucky,

    Si je comprend bien tu appel dans t'as DLL "Logmsg"qui est une fonction contenu dans ton ".exe".

    1) Je pense que ce n'est pas bon il faut utilisé dans "getmsgHookProc" un "PostMessage(hDestWindow, WM_MY_MESSAGE, toto, titi);"
    2) Le message est ensuite récupérer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	while( GetMessage(&msg, NULL, 0, 0)==TRUE)  
    	{
    		TranslateMessage( &msg );			
    		DispatchMessage( &msg );	// Permet d'appeler la fonction "LRESULT CALLBACK MainWndProc"	
    	}
    3) Ensuite tu peux traiter le message avec une fonction du type :
    LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    4) Traité ton message.

    J'espère avoir répondu a ton problème.

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/05/2007, 15h34
  2. Réponses: 9
    Dernier message: 19/02/2007, 16h42
  3. Un défi pour des pros
    Par Total_amateur dans le forum Langage
    Réponses: 9
    Dernier message: 17/10/2006, 10h03
  4. Documentez vos librairies JavaScript comme des pros !
    Par Claude Pelletier dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 13/12/2005, 14h09

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