如何拦截掉系统发送消息的行为?(发送时拦截,不是接收时拦截)

stone4774 2011-03-12 10:11:15
具体需求是这样的:处于不同线程的父子窗口,当子窗口所在线程卡死时,不能导致父窗口卡死

目前使用Detours将父窗口线程中的SendMessage,SetWindowPos等等都hook了,当发现其操作其他线程的窗口时,则直接返回,防止阻塞,但是使用spy发现,子窗口线程仍然能收到WM_NCPAINT,WM_PARENTNOTIFY,WM_MOUSEACTIVE等事件,并且其都是被同步发送的,所以现在问题是如何在父窗口线程发送这些事件时就拦截他们?

希望各位大侠帮下忙!
...全文
137 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
stone4774 2011-05-20
  • 打赏
  • 举报
回复
to hkf314:
父子窗口不属于同一线程,他们都有自己的消息循环; 使用GetMessage获取消息然后判断窗口句柄,似乎并不可取,主要是,只有通过PostMessage等发送的异步消息,才会触发GetMessage返回结果,执行如SendMessage等发送的同步消息时,GetMessage并不返回,微软内部就直接处理掉了; 而类似WM_NCPAINT等消息,是系统自动产生,发送到顶层窗口,然后顶层窗口同步向下派发,这个过程似乎我们不能干预; 子窗口所在线程是在GetMessage内部执行这个消息, 假使当前子窗口所在线程卡死,则主窗口所在线程就必然誓死等待了。

研究IE9的窗口结构,就可以发现其父子窗口不属于同一进程,并且子窗口不会卡死父窗口,这里面和win7平台有一定关系,目前发现win7和XP其界面绘制机理不一样,但目前在win7下实现的,仍然有可能卡死,无法完全避免,就是因为WM_NCPAINT等系统内部消息不好处理
菜鸟二号 2011-04-02
  • 打赏
  • 举报
回复
只要是发送了消息,那么肯定要经过消息队列,如果你的子父窗体的消息队列为同一个的话,不如在
GetMessage时获取的消息里判断msg.hwnd是否为目标子窗体的句柄,如果是,则不转发此消息(你懂如何不转发吧)
如果不是在同一个消息队列,方法类似,但是这样的话,你的子窗体有什么用吗,相应不了任何消息?

另外,如果真的想实现这种效果,再创建一个进程管理子窗体,与父窗体基本没有任何瓜葛,岂不更好
凌枫 2011-04-02
  • 打赏
  • 举报
回复
SendMessage的时候,是要等待接收方给你回消息,才能继续往下走,不然就会处于等待状态,你看一下你是不是这个原因
要不就改为PostMessage
arong1234 2011-04-02
  • 打赏
  • 举报
回复
有些重要的消息不一定是“发送”的,而是系统通过某种方法直接调用消息处理函数的,所以你也不一定能阻止
arong1234 2011-04-02
  • 打赏
  • 举报
回复
我觉得找到为什么卡死并解决这个问题,比你用hook这么麻烦的方法来阻止要容易多了
TandyT 2011-04-02
  • 打赏
  • 举报
回复
可以接受消息时特殊处理,更方便吧。
zyrr159487 2011-04-02
  • 打赏
  • 举报
回复
敢问LZ到底是想实现什么样的功能,或许可以通过别的手段实现,不一定非要屏蔽消息的
向立天 2011-04-02
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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