窗口挂钩问题

时间:2009-05-09 07:01:05

标签: c++ winapi hook subclass

我正在使用这个:

SetWindowsHookEx(WH_CALLWNDPROC, ...);

我可以看到我想要处理的消息,但我想阻止这些消息到达目标窗口。所以我尝试了这个:

SetWindowsHookEx(WH_GETMESSAGE, ...);

当我这样做时,我可以修改消息,并阻止目标窗口处理它,但是这个钩子看不到我需要处理的消息。我认为这是因为它被发布到目标窗口的队列,而不是发送?有没有解决这个问题的方法?我听说窗口子类可能能够实现这一点,但是我可以在不同的进程中子窗口吗?有没有办法用钩子做到这一点?

3 个答案:

答案 0 :(得分:1)

你不能在另一个进程中子类化窗口,但是钩子DLL应该能够子类化你感兴趣的窗口.WH_GETMESSAGE和WH_CALLWNDPROC钩子在接收消息的进程的上下文中运行,所以在那指出你有一个“in”子类化目标的窗口。

答案 1 :(得分:0)

您可以尝试subclassing目标窗口,然后过滤消息。

答案 2 :(得分:0)

钩子文档建议不能这样做,但我认为这个策略可能有效: 使用SetWindowsHookEx(WH_CALLWNDPROC,...)

在该过程中,只需将要丢弃的消息修改为未使用的WM_值。

LRESULT CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
{
   CWPSTRUCT *C=(CWPSTRUCT *)lParam;

   if ( ...we are interested in this one) {
     ..deal with this message here...
     //Modify the message so that the client will ignore it
     C->message=WM_USER+44; //presumably ignored by client
   }       
   return GetNextHook(...);
}

讨厌但很容易?