Hook et focus

Signaler
Messages postés
66
Date d'inscription
jeudi 8 avril 2004
Statut
Membre
Dernière intervention
28 juin 2007
-
Messages postés
66
Date d'inscription
jeudi 8 avril 2004
Statut
Membre
Dernière intervention
28 juin 2007
-
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

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Un handle de fichier est attribué au processus l'ayant demandé, totalement invalide dans un autre processus.

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

Ah ok, merci, mais je peux faire quoi alors pour que cela marche sur les autre processus stp ?
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
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.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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++
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
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
Messages postés
66
Date d'inscription
jeudi 8 avril 2004
Statut
Membre
Dernière intervention
28 juin 2007

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 :(.
Messages postés
66
Date d'inscription
jeudi 8 avril 2004
Statut
Membre
Dernière intervention
28 juin 2007

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.
Messages postés
66
Date d'inscription
jeudi 8 avril 2004
Statut
Membre
Dernière intervention
28 juin 2007

Arf j'ai mal copié le code, tout ce que vous voyez en double bha n'y faites pas attention.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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++
Messages postés
66
Date d'inscription
jeudi 8 avril 2004
Statut
Membre
Dernière intervention
28 juin 2007

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.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Tu compiles avec VC++ ???

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

Oui version express.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Si bnIntA.h et bnIntA.cpp sont dans dossier du proj, ça doit compiler.

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

Ils sont bien dans le dossier du proj et ça marche pas.