Hook dans Dll

larion Messages postés 140 Date d'inscription mercredi 28 avril 2004 Statut Membre Dernière intervention 21 juillet 2005 - 18 mai 2004 à 14:54
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 - 20 mai 2004 à 21:28
Bonjour,

Mon problème est pourtant simple, mais impossible de m'en sortir sans votre aide.

J'ai ajouté des éléments dans les menus système de cette manière :
#define IDM_ABOUT 100
HMENU hSysMenu = GetSystemMenu(handle,FALSE);
AppendMenu(hSysMenu,MF_STRING,(UINT)IDM_ABOUT,"Déplacer vers [1]"); // Ajout du menu

Et je désire détecter un click sur "Déplacer vers [1]" par un Beep par exemple, dans une Dll.
Après une multitude d'essai, j'ignore completement ce qui faut mettre à la place de ???
#define IDM_ABOUT 100
LRESULT CALLBACK _export MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{ MSG msg;
PCWPSTRUCT pCwp;

pCwp = (PCWPSTRUCT)lParam;
msg.message = pCwp->message;
msg.lParam = pCwp->lParam;
msg.wParam = pCwp->wParam;
msg.hwnd = pCwp->hwnd;

switch(msg.message)
{ case WM_SYSCOMMAND:
switch ( ??? )
{ case IDM_ABOUT:
MessageBeep(MB_OK);
break;
}
break;
}
return CallNextHookEx(NULL,nCode,wParam,lParam);
}

12 réponses

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
18 mai 2004 à 19:15
je ne crois pas qu'un hook souris intercepte le message WM_SYSCOMMAND

il faut surement créer un hook sur les messages (WH_GETMESSAGE par ex)
0
larion Messages postés 140 Date d'inscription mercredi 28 avril 2004 Statut Membre Dernière intervention 21 juillet 2005
18 mai 2004 à 19:29
J'ai créer le Hook de cette manière :
SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)MouseProc,HInst,0);

J'ai fait une interception sur WM_SIZE (changement de taille d'une fenêtre) et cela fonctionne.

Je n'ai pas fait attention, mais il est vrai que je devrai utiliser
CallWndProc.
Je vais donc refaire mes testes...
0
larion Messages postés 140 Date d'inscription mercredi 28 avril 2004 Statut Membre Dernière intervention 21 juillet 2005
18 mai 2004 à 20:06
J'ai même intercepté un Close d'un fenêtre de cette manière :

switch(msg.message)
{ case WM_SYSCOMMAND:
switch (msg.wParam)
{ case SC_CLOSE:
MessageBeep(MB_OK);
break;
}
break;
}

Bon, cela fait une semaine que je suis dessus. Je vais faire une petite pause.
J'y comprends rien à ces hooks : je dis cela parce que je suis énervé ;-)
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
18 mai 2004 à 21:11
je ne sais pas si c'est çs ton pb, mais en MFC Dialog Based, pour ajouter une commande dans le menu système, l'Id doit avoir certaines conditions :
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

avec
#define IDM_ABOUTBOX 0x0010 ces assertions sont vraies
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
larion Messages postés 140 Date d'inscription mercredi 28 avril 2004 Statut Membre Dernière intervention 21 juillet 2005
18 mai 2004 à 21:46
Je n'ai pas de problème sur l'ajout d'un menu.

Je me suis inspiré de http://www.cppfrance.com/code.aspx?ID=9684

Mon problème est sur la détection d'un click sur ce menu par un hook global dans une dll.
0
larion Messages postés 140 Date d'inscription mercredi 28 avril 2004 Statut Membre Dernière intervention 21 juillet 2005
19 mai 2004 à 13:37
J'arrive à dectecter la selection (et non le click) sur un item d'un menu system

Reprennons :
J'ai ajouté des éléments dans les menus système de cette manière :
#define IDM_ABOUT 100
HMENU hSysMenu = GetSystemMenu(handle,FALSE);
AppendMenu(hSysMenu,MF_STRING,(UINT)IDM_ABOUT,"Déplacer vers [1]"); // Ajout du menu

J'ai créer le Hook de cette manière :
SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)CallWndProc,HInst,0);

La détection par :
switch(msg.message)
{ case WM_MENUSELECT :
switch(LOWORD(msg.wParam))
{ case IDM_ABOUT:
MessageBeep(MB_OK);
break;
}
break;
}

Et là, j'ai un beep lorsque ma souris passe sur ,"Déplacer vers [1]" du menu systeme.
Ce que je souhaite, c'est un beep lorsque l'on clique sur "Déplacer vers [1]".
En principe il faut remplacer WM_MENUSELECT par WM_SYSCOMMAND.
Rien n'y fait, pire WM_SYSCOMMAND n'est même pas détecté.
Et pourtant, il est écrit dans la doc API Win32:
"The menu items in a System menu can be modified by using the GetSystemMenu, AppendMenu, InsertMenu, ModifyMenu, InsertMenuItem, and SetMenuItem functions. Applications that modify the System menu must process WM_SYSCOMMAND messages."
Je ne vois pas ou se trouve le problème ????
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
19 mai 2004 à 16:24
Installe un Hook WH_GETMESSAGE
0
larion Messages postés 140 Date d'inscription mercredi 28 avril 2004 Statut Membre Dernière intervention 21 juillet 2005
19 mai 2004 à 17:36
J'ai remplacé
SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)CallWndProc,HInst,0);
par
SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)GetMsgProc,HInst,0);
Rien n'y fait, WM_SYSCOMMAND n'est même pas détecté.
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
19 mai 2004 à 23:26
c'est bizarre, j'ai fait un test et ça marche. Si t'as un mail à filer je te donnerai mon test.
0
larion Messages postés 140 Date d'inscription mercredi 28 avril 2004 Statut Membre Dernière intervention 21 juillet 2005
20 mai 2004 à 00:18
J'ai du faire un truc qu'il fallait pas.
Ton test m'intéresse.
Voici un mail temporaire HorizonPc.Pub@Wanadoo.fr.
Je te ferai un retour sur mon erreur.
Je te remercie de ton aide. :)
0
larion Messages postés 140 Date d'inscription mercredi 28 avril 2004 Statut Membre Dernière intervention 21 juillet 2005
20 mai 2004 à 17:02
Enfin! Ca marche.

Avant tout, je te remercie pour le temps que tu as passé pour m'aider.

Voici mon nouveau code :
LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{ if(nCode == HC_ACTION) // action
{ MSG* pMSG = (MSG*)lParam;
switch(pMSG->message)
{ case WM_SYSCOMMAND :
switch(LOWORD(pMSG->wParam))
{ case IDM_ABOUT1:
MessageBeep(MB_OK);
break;
}
break;
}
return CallNextHookEx(g_hHook, nCode, wParam, lParam); // on passe le relai au prochain Hook
}

J'ai juste modifié par :
> MSG* pMSG = (MSG*)lParam;
et> switch(pMSG->message)
Miracle, j'ai mon Beep. Je n'ai pas bien compris pourquoi cela ne fonctionnait pas avant ...
Le principal, c'est que ca marche maintenant.

Par contre, j'ai une petite question:
J'ai observé que tu n'utilisais pas LoadLibrary et FreeLibrary pour charger et décharger la Dll.
Le secret serait-il dans le code suivant ?

#ifndef _SYSCMDHOOK_H_INCLUDED
#define _SYSCMDHOOK_H_INCLUDED
#ifdef SYSCMDHOOK_EXPORTS
#define SYSCMDHOOK_API extern "C" __declspec(dllexport)
#else
#define SYSCMDHOOK_API extern "C" __declspec(dllimport)
#endif
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
20 mai 2004 à 21:28
Exact, la dll ou est mon hook est incluse statiquement (avec un .h et un .lib)
0
Rejoignez-nous