SetWindowsHookEx - Un classique, la callback n'est pas appelée...
Cemninho
Messages postés7Date d'inscriptionjeudi 2 septembre 2004StatutMembreDernière intervention 8 décembre 2009
-
7 déc. 2009 à 17:42
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 2010
-
9 déc. 2009 à 13:08
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 ?
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 8 déc. 2009 à 14:33
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...)
Cemninho
Messages postés7Date d'inscriptionjeudi 2 septembre 2004StatutMembreDernière intervention 8 décembre 2009 8 déc. 2009 à 17:17
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.
Cemninho
Messages postés7Date d'inscriptionjeudi 2 septembre 2004StatutMembreDernière intervention 8 décembre 2009 8 déc. 2009 à 18:30
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.
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 9 déc. 2009 à 13:08
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.