SendMessage导致程序假死的问题

jngd 2015-04-23 09:09:55
现在有两个程序:A是自研程序,可以任意修改;B是主程序,无法修改

A程序点击按钮后,功能如下:
1.A向B通过SendMessage发送Click消息点击Botton1.;
2.B弹出窗口Dlg1,A向B SendMessage发送Click确认Button2;
3.B弹出窗口Dlg2,A向B SendMessage发送Click确认Button3。

现在问题是步骤2完成后,B程序出现挂死,无法弹出Dlg2;A程序步骤3一直挂死等待Dlg2
如果把步骤1、2、3分别放到3个线程中,也无法弹出Dlg2.
如果A程序启动线程1、2、3后,立即返回退出,程序一切正常。只是部分结果无法获取。

请问下,可能是什么原因
...全文
697 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
目测你的对话框都是模态对话框,你的SendMessage的消息阻塞了。
oyljerry 2015-04-23
  • 打赏
  • 举报
回复
那就是发送的消息不对,没有触发B的按钮
jngd 2015-04-23
  • 打赏
  • 举报
回复
引用 15 楼 worldy 的回复:
创建线程是没用的,关键是B进入了dlg1后,就不会处理你的枚举之类的消息
有好的处理方案吗?目前的处理方案就是主线程退出,1、2、3步骤都基本正常工作了。就是步骤3 的返回数据无法及时获取。
worldy 2015-04-23
  • 打赏
  • 举报
回复
创建线程是没用的,关键是B进入了dlg1后,就不会处理你的枚举之类的消息
jngd 2015-04-23
  • 打赏
  • 举报
回复
引用 13 楼 worldy 的回复:
那你,B弹出了dlg1,dlg1阻塞了B的消息,B怎么去枚举?
步骤2把DLG1确认后,B目前是无响应状态。A也在等B的DLG2窗口。 我目前的做法是把步骤1、2、3分别放到3个线程处理。A的主线程抛完三个任务后,直接退出返回。 目前来看,如果A的主线程不退出,B就一直处于僵死状态,步骤3的线程也处于僵死状态。 请问有没有更好的处理方法?因为步骤3还有一些数据要返回给A的应用层。
worldy 2015-04-23
  • 打赏
  • 举报
回复
那你,B弹出了dlg1,dlg1阻塞了B的消息,B怎么去枚举?
jngd 2015-04-23
  • 打赏
  • 举报
回复
引用 10 楼 worldy 的回复:
1.A向B通过SendMessage发送Click消息点击Botton1.; 2.B弹出窗口Dlg1,A向B SendMessage发送Click确认Button2; 3.B弹出窗口Dlg2,A向B SendMessage发送Click确认Button3。 你的2中,A-B发送消息只能送到dlg1中,但是你此时是如何获得dlg1的hWnd?
A向B发消息,A获取的所有B的句柄都是 A通过枚举B的窗口,获得B的窗口句柄后,然后GetDlgItem一个个枚举出来的。 类似Spy++
jngd 2015-04-23
  • 打赏
  • 举报
回复
引用 8 楼 schlafenhamster 的回复:
2.B弹出窗口Dlg1,A向Dlg1 SendMessage发送Click确认Button2;这个按钮2必须在dlg1 上 A向Dlg1 SendMessage发送 OK ( cancel) 叫dlg1 退出 才能 继续: 3.B弹出窗口Dlg2,A向Dlg2 SendMessage发送Click确认Button3。
发送OK和 发送Click 有啥不同吗?用EndDialog 发送OK吗? 我试过A对B的Dlg1调用EndDialog OK,没反应,我再确认下。
worldy 2015-04-23
  • 打赏
  • 举报
回复
1.A向B通过SendMessage发送Click消息点击Botton1.; 2.B弹出窗口Dlg1,A向B SendMessage发送Click确认Button2; 3.B弹出窗口Dlg2,A向B SendMessage发送Click确认Button3。 你的2中,A-B发送消息只能送到dlg1中,但是你此时是如何获得dlg1的hWnd?
赵4老师 2015-04-23
  • 打赏
  • 举报
回复
schlafenhamster 2015-04-23
  • 打赏
  • 举报
回复
2.B弹出窗口Dlg1,A向Dlg1 SendMessage发送Click确认Button2;这个按钮2必须在dlg1 上 A向Dlg1 SendMessage发送 OK ( cancel) 叫dlg1 退出 才能 继续: 3.B弹出窗口Dlg2,A向Dlg2 SendMessage发送Click确认Button3。
jngd 2015-04-23
  • 打赏
  • 举报
回复
引用 3 楼 sunnyloves 的回复:
DLG1 DLG2的句柄获得的正确吗
可以正常获取。关键是DLG1的步骤处理完毕后,主进程B挂死,DLG2无法弹出。导致A进程也挂死等待DLG2.
引用 5 楼 worldy 的回复:
改成PostMessage SendMessage是要等待返回结果的
步骤一的的SendMessage改成Post,步骤1能够正常。 步骤2、3的不管用Send还是Post都无法正常。 目前我的测试情况就是,只有A程序的主线程退出,B程序才能正常弹出DLG2。
oyljerry 2015-04-23
  • 打赏
  • 举报
回复
SendMessage是阻塞方式,会需要等待返回,看你的消息接收处理程序是否及时返回了。
worldy 2015-04-23
  • 打赏
  • 举报
回复
改成PostMessage SendMessage是要等待返回结果的
孤客天涯 2015-04-23
  • 打赏
  • 举报
回复
1.首先SendMessage是同步调用,也就是说要等到消息执行完才会返回,PostMessage是异步函数,调用后立即返回。 2.如果B弹出Dlg1,或dlg2后,如果这两个对话框是模态对话框,你消息发给B的主窗口,此时B是得到不消息,被Dlg1或Dlg2阻塞了
洗洗睡去 2015-04-23
  • 打赏
  • 举报
回复
DLG1 DLG2的句柄获得的正确吗
  • 打赏
  • 举报
回复
Dlg1是不是模态对话框?
jngd 2015-04-23
  • 打赏
  • 举报
回复
对了,把步骤1的SendMesage要换成PostMessage,否则A程序挂死。 如果把后面的SendMessage换成PostMessage,没有任何效果。
void998 2015-04-23
  • 打赏
  • 举报
回复
SendMessage是阻塞的,意思是,要等对方把收到这个消息的函数执行完返回后才会返回SendMessage 所以一般情况下,慎用。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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