做了一hook本线程的钩子程序,想对menu发出的WM_COMMAND消息进行额外的处理,但是发现hook不上menu的WM_COMMAND消息,然而工具栏或者是按钮发出的WM_COMMAND消息都可以截获,请大家指教了
======================================================================
源代码如下:
======================================================================
HINSTANCE hins;
#pragma data_seg(".SHARDAT")
static HHOOK hhk=NULL;
#pragma data_seg()BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
 )
{
    if (ul_reason_for_call == DLL_PROCESS_ATTACH)
hins = (HINSTANCE)hModule;
    return TRUE;
}LRESULT WINAPI CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) { 
if (nCode < 0)  // do not process message 
return CallNextHookEx(hhk, nCode, wParam, lParam);
CWPSTRUCT * pCwp = (CWPSTRUCT*)lParam; switch (nCode) 
    { 
case HC_ACTION: 
if (pCwp->message == WM_COMMAND)
{
                                    //判断消息是否是由menu发出
if ((HIWORD(pCwp->wParam) == 0) )
{
                                    //判断menu的ID
if (LOWORD(pCwp->wParam) >= 50000)
{
//...用户的处理           }
}
}
break;
default:
break;
}
return CallNextHookEx(hhk, nCode, wParam, lParam); }
BOOL __declspec(dllexport)__stdcall InstallHook(DWORD dwThreadId)
{
hhk = SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)CallWndProc,hins,dwThreadId);
if (hhk != NULL)
return TRUE;
else
return FALSE;
}BOOL __declspec(dllexport)__stdcall UnInstallHook()
{   
BOOL bSuc = UnhookWindowsHookEx(hhk);
return bSuc;

解决方案 »

  1.   

    WM_COMMAND好像只對客戶區的對象有作用
    Menu屬於非客戶區好像不對Windows Message響應
    至於詳細代碼可以看看CreateWindow
      

  2.   

    钩子类型应该是WH_GETMESSAGE,你可以用SPY++监视菜单的消息,其消息类型是P,而不是S,所以用WH_CALLWNDPROC类型的钩子根本截不住,应用WH_GETMESSAGE.我做过这方面的。
      

  3.   

    楼主要搞清楚。WH_CALLWNDPROC并不是在调用窗口函数的时候调用钩子的,而是在SendMessage函数发送消息之前调用钩子函数的。
    解决方法如楼上所说。
      

  4.   

    yiq2003和yndfcd说的非常有道理!
    同意!