Hook et focus

krokro6
Messages postés
66
Date d'inscription
jeudi 8 avril 2004
Statut
Membre
Dernière intervention
28 juin 2007
- 3 juin 2007 à 23:41
krokro6
Messages postés
66
Date d'inscription
jeudi 8 avril 2004
Statut
Membre
Dernière intervention
28 juin 2007
- 4 juin 2007 à 20:48
Salut à tous, j'ai un gros problème depuis que j'ai commencé à utiliser les hooks, le problème est le suivant : pourquoi quand j'apelle ma fonction qui met en place le hook (InitHook) à partir d'un loader le hook ne se place que sur le programme avec lequel j'ai lancé la fonction InitHook ? exemple : http://rafb.net/p/QjV8FS98.html

ce code source de hook enregistre les coordonnées de la souris à chaque appui sur le bouton droit de la souris.

Une fois ce code compilé j'obtiens ma jolie dll qui marche à merveille mais le problème, c'est qu'elle ne marche que lorsque je fais un click droit sur le programme avec lequel j'ai appellée la fonction InitHook :'(.

Personne ne peut m'aider à régler ce problèmpe je vous en supplie :>.

Merci à tout ce qui m'aideront.

14 réponses

BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
28
4 juin 2007 à 00:16
Un handle de fichier est attribué au processus l'ayant demandé, totalement invalide dans un autre processus.

ciao...
BruNews, MVP VC++
0
krokro6
Messages postés
66
Date d'inscription
jeudi 8 avril 2004
Statut
Membre
Dernière intervention
28 juin 2007

4 juin 2007 à 12:36
Ah ok, merci, mais je peux faire quoi alors pour que cela marche sur les autre processus stp ?
0
cs_rt15
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
4 juin 2007 à 13:13
Salut,

Tu peux par exemple réouvrir le fichier dans ta MouseProc s'il ne l'est pas déjà (Tu teste que l'écriture se fait. Si elle ne se fait pas, tu ouvre le fichier).

Mais je sais pas ce que ça donne, plein de processus écrivant dans le même fichier...

DuplicateHandle permet de générer des handles valides dans les autres processes, mais le souci devient alors de transmettre la valeur de ces handles aux processus.
0
BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
28
4 juin 2007 à 15:34
Inutile le test d'écriture, ne peut pas passer.

Dans la mouseProc:
char buf[100];
DWORD d;
hfl = CreateFile(...); // avec OPEN_ALWAYS
if(hfl == INVALID_HANDLE_VALUE) return;
SetFilePointer(hfl, 0, 0, FILE_END);
// mettre coordonnées à tamponner dans buf (complet avec CRLF en finale)
WriteFile(hfl, buf, strlen(buf), &d, 0);
CloseHandle(hfl);

Ainsi tu vires les stream qui n'ont rien à faire dans du code API. Une DLL de hook doit être la plus légère possible.

ciao...
BruNews, MVP VC++
0

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

Posez votre question
cs_rt15
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
4 juin 2007 à 16:36
Heu... Pourquoi le test ne passerait-il pas ?
La première fois, ok, il ne passe pas, mais pourquoi ne passerait-il pas la deuxième ?

Si après échec d'écriture, on ouvre le fichier avec FILE_SHARE_WRITE et que l'on met son handle dans une variable globale ou statique, pourquoi le handle perdrait sa validité (Ces variables son unique pour chaque processus utilisant la dll.) ?

Je dis ça juste pour éviter le CreateFile à chaque message logué, qui est certainement pas anodain en matière de temps CPU (Vérification des droits...). Et comme on est dans un hook, autant que ça tourne vite.
http://msdn2.microsoft.com/en-us/library/ms682594.aspx
0
krokro6
Messages postés
66
Date d'inscription
jeudi 8 avril 2004
Statut
Membre
Dernière intervention
28 juin 2007

4 juin 2007 à 18:17
if(wParam == WM_RBUTTONDOWN)
{
GetCursorPos(&Mouse);

char CoordCX[5];
char CoordCY[4];

sprintf(CoordCX, "%ld", Mouse.x);
sprintf(CoordCY, "%ld", Mouse.y);

DWORD d;

HANDLE hfl = CreateFile("C:\\FichierLog.txt", GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

if(hfl == INVALID_HANDLE_VALUE)
MessageBox(NULL, "Impossible de creer un fichier MAP", "Erreur", MB_ICONERROR);

SetFilePointer(hfl, 0, 0, FILE_END);

WriteFile(hfl, CoordCX, strlen(CoordCX), &d, 0);
WriteFile(hfl, CoordCY, strlen(CoordCY), &d, 0);

CloseHandle(hfl);
}

Ce code ne marche pas :(.
0
krokro6
Messages postés
66
Date d'inscription
jeudi 8 avril 2004
Statut
Membre
Dernière intervention
28 juin 2007

4 juin 2007 à 18:44
Bon en fait tout marche bien mais le problème c'est que j'obtiens des petits carrés à la place des coordonnées...

if(wParam == WM_RBUTTONDOWN)
{
GetCursorPos(&Mouse);

char CoordCX[5];
char CoordCY[4];

sprintf(CoordCX, "%ld", Mouse.x);
sprintf(CoordCY, "%ld", Mouse.y);

DWORD d;

HANDLE hfl = CreateFile("FichierLog.txt", GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

if(hfl == INVALID_HANDLE_VALUE)
MessageBox(NULL, "Impossible de creer un fichier MAP", "Erreur", MB_ICONERROR);

SetFilePointer(hfl, 0, 0, FILE_END); WriteFile(hfl, CoordCX, strlen(CoordCX), &d, 0);

WriteFile(hfl, CoordCX, 5, &d, 0); CloseHandle(hfl);
WriteFile(hfl, CoordCY, 4, &d, 0); CloseHandle(hfl);
}

Voila merci de votre aide.
0
krokro6
Messages postés
66
Date d'inscription
jeudi 8 avril 2004
Statut
Membre
Dernière intervention
28 juin 2007

4 juin 2007 à 18:48
Arf j'ai mal copié le code, tout ce que vous voyez en double bha n'y faites pas attention.
0
BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
28
4 juin 2007 à 18:53
1 seul WriteFile, dur dur...

char buf[28], *c;
c = bnitoa(Mouse.x, buf);
*c++ = ' '; // SEPARATEUR
c = bnitoa(Mouse.y, c);
WriteFile(hfl, buf, c - buf, &d, 0);
CloseHandle(hfl); // FINI

Tu trouveras bnitoa() ici:
http://www.cppfrance.com/code.aspx?ID=36937

ciao...
BruNews, MVP VC++
0
krokro6
Messages postés
66
Date d'inscription
jeudi 8 avril 2004
Statut
Membre
Dernière intervention
28 juin 2007

4 juin 2007 à 19:05
error LNK2019: symbole externe non résolu @bnitoa@8 référencé dans la fonction "long __stdcall MouseProc(int,unsigned int,long)" (?MouseProc@@YGJHIJ@Z)

voila l'erreur que j'ai lors de la compilation, j'ai dl les fichiers bnIntA.h et bnIntA.cpp ensuite #include "bnIntA.h" et vala erreur. merci.
0
BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
28
4 juin 2007 à 19:37
Tu compiles avec VC++ ???

ciao...
BruNews, MVP VC++
0
krokro6
Messages postés
66
Date d'inscription
jeudi 8 avril 2004
Statut
Membre
Dernière intervention
28 juin 2007

4 juin 2007 à 19:42
Oui version express.
0
BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
28
4 juin 2007 à 19:47
Si bnIntA.h et bnIntA.cpp sont dans dossier du proj, ça doit compiler.

ciao...
BruNews, MVP VC++
0
krokro6
Messages postés
66
Date d'inscription
jeudi 8 avril 2004
Statut
Membre
Dernière intervention
28 juin 2007

4 juin 2007 à 20:48
Ils sont bien dans le dossier du proj et ça marche pas.
0