请教各位老大:如何用hook拦截其它程序的菜单消息?

jbz 2003-11-10 04:57:15
用hook做dll拦截其他进程的窗口消息我已经成功了,用的是:
SetWindowsHookEx(WH_CALLWNDPROC,...)
但是我确拦截不到其他进程的菜单消息。就是当用鼠标或者快捷键执行某个菜单命令时它会产生一个WM_COMMAND 消息其中wParam的高位为0,低为是菜单的ID。

我用spy观察,当点击某菜单项执行菜单命令的时候,会产生如下消息:
“ WM_COMMAND wNotifyCode:0 (从菜单发送) wID:40220 ”

这行含义我也基本明白。但是我用hook就是拦截不到这个消息。
请问如何做?

我查msdn的 SetWindowsHookEx 函数说明,好像应该使用 WH_MSGFILTER 类型的hook,但是我试了试,没有任何反应,非常困惑,请高手赐教。
...全文
194 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiuafa 2004-01-28
  • 打赏
  • 举报
回复
捧场!
nikeacer2001 2004-01-27
  • 打赏
  • 举报
回复
mark
jbz 2003-11-11
  • 打赏
  • 举报
回复
各位老大都很忙。等待中......
jbz 2003-11-10
  • 打赏
  • 举报
回复
用WH_GETMESSAGE也不行的。
nightfallrove 2003-11-10
  • 打赏
  • 举报
回复
用WH_GETMESSAGE怎么样?
jbz 2003-11-10
  • 打赏
  • 举报
回复
下面是我的主程序里接收hookdll发送过来的消息。
============================
private: // User declarations
virtual void __fastcall WndProc(TMessage &Message);

//--------------------------------------------
#define WM_COMMAND 0x0111
struct MsgData
{
UINT msg;
WPARAM wparam;
LPARAM lparam;
HWND hWnd;
char type;
char result;
};

void __fastcall TfrmMypro::WndProc(TMessage &Message)
{
PCOPYDATASTRUCT pMyCDS;
int i;
TForm::WndProc(Message);//其他的消息继续传递下去

if(Message.Msg==WM_COPYDATA)
{
String s,s0,sMsg,sClass;
UINT msg;
MsgData *msgdata;
pMyCDS=(PCOPYDATASTRUCT)Message.LParam;
msgdata=(MsgData *)pMyCDS->lpData;
msg=msgdata->msg;
......//显示其他消息
if(msg==WM_COMMAND)
{
if(HIWORD(msgdata->wparam)==0) //菜单命令
{
i=LOWORD(msgdata->wparam);
ShowMessage(i); //显示菜单id
return;
}

}
}
}
//---------------------------------------------------------------------------
jbz 2003-11-10
  • 打赏
  • 举报
回复
下面是我的hookdll的源代码,请高手帮忙看看。
========================
HINSTANCE hMod=NULL;
static HWND hParentWnd;
struct HOOKINFO
{
HHOOK hook;
DWORD dThreadId;
}hk;

struct MsgData
{
UINT msg;
WPARAM wParam;
LPARAM lParam;
HWND hwnd;
char type;
char result;
};

extern"C" __declspec(dllexport) bool __stdcall InstallHook(HWND hWnd,DWORD dThreadId);
extern"C" __declspec(dllexport) bool __stdcall DisableHook(HWND hWnd,DWORD dThreadId);
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam);
void ShowError();
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
switch(reason)
{
case DLL_THREAD_ATTACH:
case DLL_PROCESS_ATTACH:
hMod=hinst;
hParentWnd=FindWindow("TfrmMypro",NULL);
break;
case DLL_PROCESS_DETACH:
UnhookWindowsHookEx(hk.hook);
hk.hook=NULL;
break;
}
return 1;
}
//---------------------------------------------------------------------------
extern"C" __declspec(dllexport) bool __stdcall DisableHook(HWND hWnd,DWORD dThreadId)
{
if(hk.hook&&hk.dThreadId==dThreadId)
{
bool b=UnhookWindowsHookEx(hk.hook);
hk.hook=NULL;
return b;
}
return 0;
}
//---------------------------------------------------------------------------
extern"C" __declspec(dllexport) bool __stdcall InstallHook(HWND hWnd,DWORD dThreadId)
{
if(hk.hook&&hk.dThreadId==dThreadId)
{
//ShowMessage("已经hook啦");
return 1;
}
hk.hook=SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)CallWndProc,hMod,dThreadId);

//hk.hook=SetWindowsHookEx(WH_MSGFILTER,(HOOKPROC)CallWndProc,hMod,dThreadId);
//hk.hook=SetWindowsHookEx(WH_CBT,(HOOKPROC)CallWndProc,hMod,dThreadId);
//hk.hook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)CallWndProc,hMod,dThreadId);

if(hk.hook)
{
hk.dThreadId=dThreadId;
return true;
}
else ShowError();
return false;
}
//---------------------------------------------------------------------------
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode>=0&&IsWindow(hParentWnd))
{
CWPSTRUCT* mm=(CWPSTRUCT*)lParam;
MsgData data;
data.msg=mm->message;
data.wParam=mm->wParam; // (int)
data.lParam=mm->lParam; //(int)
data.hwnd=mm->hwnd;
data.type=1;
data.result=0;
COPYDATASTRUCT copydata;
copydata.dwData=0;
copydata.cbData=sizeof(MsgData);
copydata.lpData=&data;
SendMessage(hParentWnd,WM_COPYDATA,0,(LPARAM)©data);
}
return CallNextHookEx(hk.hook,nCode,wParam,lParam);
}
//---------------------------------------------------------------------------
void ShowError()
{
char lpMsgBuf[200];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL,
GetLastError(), 0, lpMsgBuf, 200, NULL);
ShowMessage(lpMsgBuf);
}
//---------------------------------------------------------------------------
我用上面的代码可以hook到其他进程,比如“记事本”,并且能够拦截到
WM_MENUSELECT、WM_INITMENUPOPUP、WM_COMMAND 等消息,我把拦截到的消息通过:
SendMessage(hParentWnd,WM_COPYDATA,0,(LPARAM)©data);发送到我的主程序。
就是没有发现菜单命令的消息。

13,870

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧