1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
| #include <windows.h>
#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT
#endif
static HHOOK m_HookCreatePopUp = NULL;
static HHOOK m_HookOnClicMenu = NULL;
static CWPSTRUCT *cwp;
static HINSTANCE m_hinst=NULL;
enum
{
ID_SUBMENU_BUREAU=5000,
ID_MENU_BUREAU1,
ID_MENU_BUREAU2,
ID_MENU_BUREAU3,
ID_MENU_BUREAU4
};
// CallBack interception et création de menu systeme
LRESULT CALLBACK HookCreatePopUp(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION)
{
cwp=reinterpret_cast<CWPSTRUCT*>(lParam);
if((cwp->message)==WM_INITMENUPOPUP)
{
if (HIWORD((HMENU)(cwp->lParam)) == 1)
{
GetSystemMenu(cwp->hwnd,true);
HMENU menu = GetSystemMenu(cwp->hwnd,false);
HMENU submenu = CreatePopupMenu();
AppendMenu(submenu,MF_STRING,ID_MENU_BUREAU1,"Bureau 1");
AppendMenu(submenu,MF_STRING,ID_MENU_BUREAU2,"Bureau 2");
AppendMenu(submenu,MF_STRING,ID_MENU_BUREAU3,"Bureau 3");
AppendMenu(submenu,MF_STRING,ID_MENU_BUREAU4,"Bureau 4");
AppendMenu(menu,MF_SEPARATOR,0,0);
AppendMenu(menu, MF_STRING|MF_POPUP,(UINT)submenu, "Déplacer vers");
}
}
}
return(CallNextHookEx(m_HookCreatePopUp, nCode, wParam, lParam));
}
// CallBack clic de menu systeme
LRESULT CALLBACK HookOnClicMenu(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION)
{
MSG *msg = reinterpret_cast<MSG*>(lParam);
if((msg->message)==WM_SYSCOMMAND)
{
if ((msg->wParam) == ID_MENU_BUREAU1)
{
MessageBox(NULL, "Déplacement vers le bureau 1!", "message", MB_OK);
}
else if ((msg->wParam) == ID_MENU_BUREAU2)
{
MessageBox(NULL, "Déplacement vers le bureau 2!", "message", MB_OK);
}
else if ((msg->wParam) == ID_MENU_BUREAU3)
{
MessageBox(NULL, "Déplacement vers le bureau 3!", "message", MB_OK);
}
else if ((msg->wParam) == ID_MENU_BUREAU4)
{
MessageBox(NULL, "Déplacement vers le bureau 4!", "message", MB_OK);
}
}
}
return(CallNextHookEx(m_HookOnClicMenu, nCode, wParam, lParam));
}
DLL_EXPORT bool Hook(HWND hwnd)
{
if(m_hinst==NULL)
{
MessageBox(NULL,"m_hinst=NULL","",0);
}
m_HookCreatePopUp = SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)HookCreatePopUp,m_hinst,0);
m_HookOnClicMenu = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)HookOnClicMenu,m_hinst,0);
if ((m_HookCreatePopUp != NULL )&&(m_HookOnClicMenu != NULL))
return true;
return false;
}
DLL_EXPORT bool UnHook()
{
if (cwp!=NULL)
{
GetSystemMenu(cwp->hwnd, true);
}
if(UnhookWindowsHookEx(m_HookCreatePopUp)&&UnhookWindowsHookEx(m_HookOnClicMenu))
{
return true;
}
return false;
}
DLL_EXPORT void VireMenu()
{
//Resaurer le menu cwp->hwnd à l'originale
GetSystemMenu(cwp->hwnd,true);
}
extern "C" bool APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
m_hinst=hinstDLL;
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
// return FALSE to fail DLL load
break;
case DLL_PROCESS_DETACH:
// detach from process
break;
case DLL_THREAD_ATTACH:
// attach to thread
break;
case DLL_THREAD_DETACH:
// detach from thread
break;
}
return true; // succesful
} |
Partager