SetWindowsHookEx - Un classique, la callback n'est pas appelée...

Signaler
Messages postés
7
Date d'inscription
jeudi 2 septembre 2004
Statut
Membre
Dernière intervention
8 décembre 2009
-
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
-
Bonjour à tous,

Après avoir éplucher énormément de posts sur ce sujet en vain, je me tourne vers vous.

J'essaye de pouvoir capter les appuis touches sur un appareil mobile (Windows CE 5.0). Mon but est de pouvoir appeler une méthode de DLL GetKeystroke() qui me renverra le code correspondant à la touche appuyée.

Dans un premier temps, je travaille sans DLL, dans un projet 'Console' où je désire uniquement capter des appuis touches. Mon code n'a rien de méchant, il se limite pour le moment à l'appel de la méthode qui met en place le hook, suivi d'un Sleep de 10s.

Voici mon appel de SetWindowsHookEx

SetWindowsHookEx(WH_KEYBOARD_LL, LLKeyboardHookCallbackFunction, NULL, 0);
-> Je désire capter les appuis touche de manière globale (pas de fenêtre windows).

avec pour callback :
[b]LRESULT CALLBACK LLKeyboardHookCallbackFunction(
int nCode,
WPARAM wParam,
LPARAM lParam )
{
printf("KeyStroke \n");
};/b

Constat : je n'entre jamais dans la callback, meme avec un appui touches simulé par le logiciel avec keybd_event. Est-ce que quelqu'un saurait me dire ce que je fais de travers ?

Merci

4 réponses

Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Bonjour;

Extrait du SDK pour ce hook :

This hook is called in the context of the thread that installed it. The
call is made by sending a message to the thread that installed the hook. Therefore, the thread that installed the hook must have a message loop.

Traduction : c'est pas une callback au sens propre du terme, il faut récupérer les messages (GetMessage-TranslateMessage-DispatchMessage...)
Messages postés
7
Date d'inscription
jeudi 2 septembre 2004
Statut
Membre
Dernière intervention
8 décembre 2009

Je ne suis pas certain qu'il faille une pompe a message. GetMessage, DispatchMessage et TranslateMessage servent à traiter des messages propres aux fenêtres type WM_xxx. Or je n'ai aucune fenêtre de créée et donc forcément, pas de handle de fenêtre, nécessaire à l'appel de GetMessage par exemple...

Est-ce que tu pourrais me donner le lien de la page où tu as trouvé cet extrait ?

J'ai encore passé ma journée à me renseigner sur cette anomalie. Avec un code similaire, certaines personnes arrivent à recevoir les appuis touches, je n'y comprend rien.
Ma callback n'est jamais appelée et, ce qui est étrange, c'est qu'une fois une touche appuyée, le curseur de la souris se fige et le texte tapé n'est pas affiché à l'écran. Si derrière je tue mon application, tous les mouvements de souris qui ne se sont pas affichés jusque là s'executent soudainement et le texte tapé apparait à l'écran. C'est comme si les evenements s'accumulaient en mémoire sans jamais être dépilés.

Merci toutefois pour ta participation.
Messages postés
7
Date d'inscription
jeudi 2 septembre 2004
Statut
Membre
Dernière intervention
8 décembre 2009

Je reviens avec beaucoup d'espoir ! Suite à ton post juju12, j'ai creusé dans ce sens là et en effet il est nécessaire d'avoir une pompe à message et par conséquent, une fenêtre !!!

Le fait est qu'il est nécessaire d'avoir un message WM_KEYDOWN pour pouvoir appeler la callback associée à SetWindowsHookEx. Par contre, il n'est pas nécessaire d'afficher la fenêtre (SW_HIDE) pour récupérer les évenements.

Bon bah ya plus qu'à !

Merci encore !
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Attention, pas de confusion : les piles de messages sont associées aux threads et pas aux fenêtres, donc tu peux très bien recevoir des messages même sans fenêtre (exemple : dialogue entre threads par messages WM_USER+X etc.)
Quant aux sources, tu peux chercher SetWindowsHookEx sur MSDN, ou télécharger le Platform SDK, indispensable pour développer sous Windows.