我正在使用这个:
SetWindowsHookEx(WH_CALLWNDPROC, ...);
我可以看到我想要处理的消息,但我想阻止这些消息到达目标窗口。所以我尝试了这个:
SetWindowsHookEx(WH_GETMESSAGE, ...);
当我这样做时,我可以修改消息,并阻止目标窗口处理它,但是这个钩子看不到我需要处理的消息。我认为这是因为它被发布到目标窗口的队列,而不是发送?有没有解决这个问题的方法?我听说窗口子类可能能够实现这一点,但是我可以在不同的进程中子窗口吗?有没有办法用钩子做到这一点?
答案 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(...);
}
讨厌但很容易?