窗户挂钩问题
Posted
技术标签:
【中文标题】窗户挂钩问题【英文标题】:Window Hooking Questions 【发布时间】:2009-05-09 07:01:05 【问题描述】:正在使用这个:
SetWindowsHookEx(WH_CALLWNDPROC, ...);
我可以看到我想要处理的消息,但我想阻止这些消息到达目标窗口。所以我尝试了这个:
SetWindowsHookEx(WH_GETMESSAGE, ...);
当我这样做时,我可以修改消息,并阻止目标窗口处理它,但是这个钩子看不到我需要处理的消息。我想这是因为它被发布到目标窗口的队列中,而不是发送?有没有办法解决这个问题?我听说窗口子类化可能能够做到这一点,但我可以在不同的进程中对窗口进行子类化吗?有没有办法使用钩子来做到这一点?
【问题讨论】:
【参考方案1】:您不能在另一个进程中对窗口进行子类化,但挂钩 DLL 应该能够对您感兴趣的窗口进行子类化。WH_GETMESSAGE 和 WH_CALLWNDPROC 挂钩在接收消息的进程的上下文中运行,因此指出你有一个“in”来子类化目标的窗口。
【讨论】:
【参考方案2】:你可以尝试subclassing目标窗口,然后过滤消息。
【讨论】:
子类化是否适用于处于不同进程中的窗口?【参考方案3】:钩子文档表明这无法完成,但我认为这种策略可能会奏效: 使用 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(...);
讨厌但容易吗?
【讨论】:
以上是关于窗户挂钩问题的主要内容,如果未能解决你的问题,请参考以下文章