如题。
具体的问题是这样,两个独立的线程A和B。B是一个前台窗口线程。B有时会调用 MessageBox() 或 DialogBox() 弹出模态的消息框或者对话框。
因为线程A的某一项操作取决于B是否处于模态循环中,所以需要事先得知。
现在的问题就是,怎样得知B是否处于模态循环(即有模态窗口打开)呢?
希望不要用 FindWindow() 之类的方法解决,能不能从模态循环的机制上入手,予以解决?
另外,还想了解一下,模态循环与非模态循环消息处理上的区别。因为调试发现,在模态循环中,消息不经过 GetMessage() 的,然而窗口过程却能被调用,那么是谁调用的呢?

解决方案 »

  1.   

    能不能用一个变量来保存B有没有调用MessageBox之类的,B调用前设为TRUE,返回之后设为FALSE
      

  2.   

    就是在调用DoModal函数的时候,设置变量值
    然后查看变量,是否在处于模态?
    是不是这样?
      

  3.   

    "另外,还想了解一下,模态循环与非模态循环消息处理上的区别。因为调试发现,在模态循环中,消息不经过 GetMessage() 的,然而窗口过程却能被调用,那么是谁调用的呢?"上面这个问题找到答案了,原来是模态的对话框里面也有一个消息循环,接管了原来的消息循环。如果有发给父窗体的消息(不是全部,很多被过滤掉了),还是会调用原来的窗口过程的。我原来在A线程用 PostThreadMessage() 向B线程发消息的,在模态的时候,这个消息被吃了(其实就算是没有对话框弹出时,DispatchMessage() 也不会将 hWnd 不等于本窗体的消息投递,并呼叫窗口过程的)。
      

  4.   

    模式对话框和非模式对话框区别在于:
    1、模式对话框将父窗体DISABLE了。
    2、模式对话框有自己的消息循环。
    注意,虽然父窗体被Disable了,但是父窗体仍然响应部分消息,例如WM_PAINT,当拖动父窗体上的模式对话框时,父窗体就响应WM_PAINT消息,绘制无效区域,擦去模式对话框上次覆盖父窗体留下的痕迹。
      

  5.   


    对,这个消息试过。
    还有一个就是WM_SETCURSOR,也可以收到。还有就是 >=WM_USER的了。