Vs2005 kbdhook

Signaler
Messages postés
34
Date d'inscription
dimanche 17 décembre 2006
Statut
Membre
Dernière intervention
16 juillet 2008
-
Messages postés
34
Date d'inscription
dimanche 17 décembre 2006
Statut
Membre
Dernière intervention
16 juillet 2008
-
bonjour,
j'ai cree une app avec une dll pour faire un hook global clavier, malheureusement celui ci ne fonctionne pas.

#include

"toolbox.h"static

HHOOK hkbhk = 0;
static

HINSTANCE hdll = 0;LRESULT CALLBACK KbdhkProc(

int nCode, WPARAM wParam, LPARAM lParam){

if(!nCode)

return CallNextHookEx(hkbhk, nCode, wParam, lParam);

if(wParam==WM_KEYUP){

MessageBox(0,
"ok c bon", 0, 0);

return 1;}

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

 

BOOL WINAPI DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID Reserved)

{

if(dwReason == DLL_PROCESS_ATTACH) {

hdll = hDll;

hkbhk = SetWindowsHookEx(WH_KEYBOARD, KbdhkProc, hDll, 0);

}

if(dwReason == DLL_PROCESS_DETACH) {

UnhookWindowsHookEx(hkbhk);

}

return 1;}

Des idees?

13 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Une excellente idée, que tu consultes les nombreux exemples que j'ai fait sur ce sujet.

La DLL c'est le code qui sera injecté dans les processus, ce n'est donc pas dedans qu'on appelle SetWindowsHookEx, c'est l'exe qui veut mapper la DLL dans les processus qui l'appellera. Idem pour démappage UnhookWindowsHookEx.

ciao...
BruNews, MVP VC++
Messages postés
34
Date d'inscription
dimanche 17 décembre 2006
Statut
Membre
Dernière intervention
16 juillet 2008

Merci de repondre aussi vite!
apparement le prob vien de la declaration des fonctions, si je dis pas de betise c la table dadresse des fonctions dans l'executable, mais en quoi cela gene t il le callback?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Mais c'est heureux que ça ne fonctionne pas, tu crées une réentrance infinie en appelant le chargement de hook dans l'attachProcess de la dll, c'est du terrorisme d'OS.

ciao...
BruNews, MVP VC++
Messages postés
34
Date d'inscription
dimanche 17 décembre 2006
Statut
Membre
Dernière intervention
16 juillet 2008

le fait dappeller sethook a l'attach d'accord, mais pour la reloc?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
La signature du callback est bonne, no prob d'adresse non plus.

ciao...
BruNews, MVP VC++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Autre chose, jamais de MessageBox ni autre fonction blocante dans un hook, il faut traiter le plus vite possible sinon le system repasse le message sans t'attendre.

ciao...
BruNews, MVP VC++
Messages postés
34
Date d'inscription
dimanche 17 décembre 2006
Statut
Membre
Dernière intervention
16 juillet 2008

La msgbox c juste pour debug, apres c un postmsg.Ca devrai marcher,
merci encore!
Messages postés
34
Date d'inscription
dimanche 17 décembre 2006
Statut
Membre
Dernière intervention
16 juillet 2008

et je ferais des efforts pour pour ecrire correctement
Messages postés
34
Date d'inscription
dimanche 17 décembre 2006
Statut
Membre
Dernière intervention
16 juillet 2008

Un dernier truc,tout marche bien sauf que le hookmsg, malgre le return 1 n'est pas retire bien qu'il soit traite(msgbox).D'ou cela vient-il et comment y remedier?
Messages postés
34
Date d'inscription
dimanche 17 décembre 2006
Statut
Membre
Dernière intervention
16 juillet 2008

pardon, je voulais dire uniquement le 1er hookmsg
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Essaie sans MessageBox, devrait aller.

ciao...
BruNews, MVP VC++
Messages postés
34
Date d'inscription
dimanche 17 décembre 2006
Statut
Membre
Dernière intervention
16 juillet 2008

Une derniere chose, je n'arrive pas a traduire le vkcode en char avec toascii

BYTE kbs[256];
GetKeyboardState(kbs);
KBDLLHOOKSTRUCT* kbd;
kbd = (KBDLLHOOKSTRUCT*)wParam;
LPWORD ld =

new WORD;
ToAscii(kbd->vkCode, kbd->scanCode, kbs, ld, 0);
MessageBoxA((LPSTR)ld, 0, 0);

Une idee?
Messages postés
34
Date d'inscription
dimanche 17 décembre 2006
Statut
Membre
Dernière intervention
16 juillet 2008

c regle merci pour tout!