Les Hooks sans le capitaine crochet

J’ai besoin de développer un logiciel qui capture tous les événements générés par le clavier. Alors pour ça, j’ai fait une petite recherche sur Internet et j’ai trouvé les “hooks”. Mais le problème, c’est que je sais pas comment on s’en sert. Alors s’il y aurait une âme généreuse qui pourrait m’indiquer la voie des “hooks”, ou un tout autre moyens de gérer le événements claviers, je serais très heureux.
J’ai essayé avec les MFC mais les événements KeyUp et KeyDown (ou un truc dans le genre) ne fonctionnement pas lorqu’il y a un élément de dialogue (comme une zone de saisie par exemple). Et c’est d’ailleurs pour ça que je me suis intéréssé aux hooks.

Pour les hooks, tu as doit d’abord creer la fonction qui se chargera d’interpreter les messages :

LRESULT CALLBACK HookFunc(int nCode, WPARAM wParam, LPARAM lParam)

{

MSG *lpmsg;

lpmsg = (MSG *) lParam;



switch (lpmsg->message)

{

case WM_KEYDOWN:

	break;

case WM_KEYUP:

	break;

}

}[/quote]
Jusqu’ici rien de bien méchant, ensuite il faut initialiser le hook dans la boucle principale du programme :

//A garder dans un coin :

HOOK g_hhk;

//Dans la boucle proprement dite :

g_hhk = SetWindowsHookEx(WH_GETMESSAGE,HookFunc, (HINSTANCE) NULL, GetCurrentThreadId());

//Une fois que t’en a plus besoin:

UnhookWindowsHookEx(g_hhk);

Cet appel te permet de filtrer absolument tous les messages reçu par
une voir plusieurs fenêtres (il suffit de mettre un hook utilisant la
même fonction pour chaque HWND).

Ce message a été édité par TwinSidE le 25/10/2003

Juste un petit conseil d’utilisation: quand on peut s’en passer il vaut mieux Parceque comme source de bugs a s’arracher les cheveux quand ca devient bien complexe dans le routage des messages c’est la joie. Les cas ou on en a besoin sont assez bien delimites et faut pas en mettre a toute les sauces.
Ce message a été édité par GloP le 26/10/2003

Cool,
Merci TwinSidE, j’vais essayer de me debrouiller avec ça. J’pense que j’en ai assez pour pouvoir faire ce que je veux.
Ce message a été édité par MrDjE le 30/10/2003