Spy++ et hook

cs_bamoo Messages postés 17 Date d'inscription vendredi 29 août 2003 Statut Membre Dernière intervention 21 décembre 2004 - 26 juin 2004 à 23:19
cs_bamoo Messages postés 17 Date d'inscription vendredi 29 août 2003 Statut Membre Dernière intervention 21 décembre 2004 - 28 juin 2004 à 21:09
Bonjour, j'ai un petit problème avec un hook qui en marche pas. J'aimerais intercepter les messages envoyés à une application. j'ai utilisé spy++ pour déterminer les messages envoyés mais je n'arrive pas à les intercepter.

Voici le code de la dll utilisée pour le hook :

#include <windows.h>
#include <winuser.h>
#include <commctrl.h>

HINSTANCE thismod;
HHOOK hhk;

BOOL WINAPI DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID Reserved)
{
if(dwReason == DLL_PROCESS_ATTACH)
thismod = hDll;

return 1;
}

LRESULT CALLBACK kbdWinAmp(int nCode, WPARAM wParam, LPARAM lParam) {
if(nCode >= 0)
{

MSG* pMSG = (MSG*)lParam;

switch(pMSG->message)
{
case WM_MDISETMENU :
case WM_NCHITTEST :
case WM_NCPAINT:
case WM_GETTEXT:
MessageBeep(MB_OK);
MessageBoxA(0,"ici","ici",0);
break;
}

}

return CallNextHookEx(hhk, nCode, wParam, lParam);
}

extern "C" __declspec(dllexport) int __stdcall Intercepte()
{
if(!hhk)
hhk = SetWindowsHookEx(WH_GETMESSAGE, kbdWinAmp, thismod, 0);

return (int) hhk;
}

extern "C" __declspec(dllexport) void __stdcall FinIntercepte()
{
if(hhk)
{
UnhookWindowsHookEx(hhk);
hhk = 0;
}
}

Autre chose, est il possible de voir les mesages au lancement d'une application avec spy++ ?

Pouvez vous m'aidez svp ?
Merci
A voir également:

8 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 juin 2004 à 00:51
Faut bannir MessageBox et toute autre action user pendant le traitement du hook sinon tu auras de la reentrance donc boucle infinie et tu risques d'embarquer quasi tous les processus dans la galere.
On verra le reste demain.

ciao...
BruNews, Admin CS, MVP Visual C++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 juin 2004 à 14:28
bon je t'ai fait un exemple qui log 3 messages seulement:
WM_NCHITTEST, WM_NCPAINT et WM_GETTEXT.
Log est niveau systeme toutes fenetres, enregistre dans fichier M.txt dans dossier temp du exe lanceur.
Tests faits sur XP et Server 2003.
M.txt contient ce genre de lignes:
WM_NCPAINT
WM_NCPAINT
WM_GETTEXT
WM_NCPAINT
WM_NCPAINT
WM_GETTEXT
WM_NCHITTEST
WM_NCHITTEST
WM_NCHITTEST
WM_GETTEXT
WM_NCPAINT
WM_GETTEXT
....

1 event par ligne sans distinction de la fenetre ni rien d'autre. A toi d'ajouter ce dont tu auras besoin (titre fenetre etc...), tu peux absolument tout capter sur ce modele mais fais bien gaffe a ne pas planter le systeme. Je te le passe fonctionnant mais je decline toute responsabilite sur modifs erronnees...

Passe ton mail dans un message perso sur ce site pour envoi.

ciao...
BruNews, Admin CS, MVP Visual C++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 juin 2004 à 18:25
bamoo > Excuse mais il y a un BIG defaut dans exemple fourni (partage du hfl interprocessus est errone). Tu me redonneras ton mail (eh oui deja disparu) si tu veux un autre exemple, correct cette fois.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_bamoo Messages postés 17 Date d'inscription vendredi 29 août 2003 Statut Membre Dernière intervention 21 décembre 2004
28 juin 2004 à 18:41
hfl ?
En tout cas, je l'ai pas vu ce problème mais je veux bien que tu me le renvois (je te redonne mon mail en message perso).

Sinon, j'ai une petit question vite fait, comment faire pour empêcher que le message soit transmis à l'application cible ?
J'ai essayé retrun 0 et return 1 au lieu de return CallNextHookEx, mais apparemment, ca ne marche pas...

Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 juin 2004 à 19:48
Le hook de mon exemple ne doit pas etre interrompu.
Si tu veux en intercepter et ne pas repasser, faut mettre d'autres hooks dans la dll, aucun probleme si plusieurs dans la meme dll, faut juste faire gaffe a la coherence de la chose.

Je suis en train de modifier completement exemple precedent.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_bamoo Messages postés 17 Date d'inscription vendredi 29 août 2003 Statut Membre Dernière intervention 21 décembre 2004
28 juin 2004 à 20:48
Je n'ai pas bien compris comment il fallait faire pour empêcher la retransmission. Peut tu m'en dire un peu plus svp ?
Merci :-)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 juin 2004 à 21:02
Certains hooks comme WH_KEYBOARD permettent qu'on interrompe la retransmission, return 1 par exemple, ou qu'on modifie les valeurs a transmettre. Avec d'autres c'est totalement deconseille, tu risques le crash. Ceci dit on peut parfois, c'est une question de logique, regarde bien le type de message, si tu penses que non vital alors tu testes mais enregistre bien tout avant.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_bamoo Messages postés 17 Date d'inscription vendredi 29 août 2003 Statut Membre Dernière intervention 21 décembre 2004
28 juin 2004 à 21:09
Donc, si j'ai bien compris, avec "return 1", le message n'est pas transmis ? bizarre, il me sembalit que si, je vais tester c sur des messages pas très importants (si j'en trouve :-)
Merci
0
Rejoignez-nous