窗户挂钩问题

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(...);

讨厌但容易吗?

【讨论】:

以上是关于窗户挂钩问题的主要内容,如果未能解决你的问题,请参考以下文章

重新粉刷开罗的窗户?

如何防止窗户被移动?

我可以在窗户里面放窗户吗?像一个视频播放器

防止窗户打开

如何制作带圆角的窗户

窗户上的qyoto