怎样判断一个线程处于模态循环?

Soyokaze 2009-08-24 03:16:12
如题。
具体的问题是这样,两个独立的线程A和B。B是一个前台窗口线程。B有时会调用 MessageBox() 或 DialogBox() 弹出模态的消息框或者对话框。
因为线程A的某一项操作取决于B是否处于模态循环中,所以需要事先得知。
现在的问题就是,怎样得知B是否处于模态循环(即有模态窗口打开)呢?
希望不要用 FindWindow() 之类的方法解决,能不能从模态循环的机制上入手,予以解决?
另外,还想了解一下,模态循环与非模态循环消息处理上的区别。因为调试发现,在模态循环中,消息不经过 GetMessage() 的,然而窗口过程却能被调用,那么是谁调用的呢?
...全文
85 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Soyokaze 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 heksn 的回复:]
模式对话框和非模式对话框区别在于:
1、模式对话框将父窗体DISABLE了。
2、模式对话框有自己的消息循环。
注意,虽然父窗体被Disable了,但是父窗体仍然响应部分消息,例如WM_PAINT,当拖动父窗体上的模式对话框时,父窗体就响应WM_PAINT消息,绘制无效区域,擦去模式对话框上次覆盖父窗体留下的痕迹。

[/Quote]

对,这个消息试过。
还有一个就是WM_SETCURSOR,也可以收到。还有就是 >=WM_USER的了。
MoXiaoRab 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 oyljerry 的回复:]
模态,非模态都是有消息循环,只不过一个是替代父窗口的,一个是独立的...
[/Quote]
没错
  • 打赏
  • 举报
回复
模式对话框和非模式对话框区别在于:
1、模式对话框将父窗体DISABLE了。
2、模式对话框有自己的消息循环。
注意,虽然父窗体被Disable了,但是父窗体仍然响应部分消息,例如WM_PAINT,当拖动父窗体上的模式对话框时,父窗体就响应WM_PAINT消息,绘制无效区域,擦去模式对话框上次覆盖父窗体留下的痕迹。
oyljerry 2009-08-24
  • 打赏
  • 举报
回复
模态,非模态都是有消息循环,只不过一个是替代父窗口的,一个是独立的...
Soyokaze 2009-08-24
  • 打赏
  • 举报
回复
"另外,还想了解一下,模态循环与非模态循环消息处理上的区别。因为调试发现,在模态循环中,消息不经过 GetMessage() 的,然而窗口过程却能被调用,那么是谁调用的呢?"

上面这个问题找到答案了,原来是模态的对话框里面也有一个消息循环,接管了原来的消息循环。如果有发给父窗体的消息(不是全部,很多被过滤掉了),还是会调用原来的窗口过程的。

我原来在A线程用 PostThreadMessage() 向B线程发消息的,在模态的时候,这个消息被吃了(其实就算是没有对话框弹出时,DispatchMessage() 也不会将 hWnd 不等于本窗体的消息投递,并呼叫窗口过程的)。
zhaohongbo83 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 conry 的回复:]
设置一个标志应该就可以了

[/Quote]
就是在调用DoModal函数的时候,设置变量值
然后查看变量,是否在处于模态?
是不是这样?
whg01 2009-08-24
  • 打赏
  • 举报
回复
是模态窗口调用的,模态窗口是B的子窗口。
用全局变量做标记吧,比较简单。
Conry 2009-08-24
  • 打赏
  • 举报
回复
设置一个标志应该就可以了
MoXiaoRab 2009-08-24
  • 打赏
  • 举报
回复
模式的时候,窗口的一些消息被堵塞,你发送个被阻塞的消息玩玩,看能不能得到,得不到说明现在处于模式状态
CoderOfVC 2009-08-24
  • 打赏
  • 举报
回复
能不能用一个变量来保存B有没有调用MessageBox之类的,B调用前设为TRUE,返回之后设为FALSE

15,471

社区成员

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

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