某些界面api内部又会启动一个消息循环,直到满足一定条件才退出。
例如:对话框的DoModal,消息框的MessageBox,菜单的 TracePopupMenu
mfc的CSocket的“同步阻塞”也用类似方式来模拟。
这样从使用者角度来看,这些api好像是阻塞的,有结果才返回。但消息队列依然运转,界面不会卡住。我的问题是,能否得到 启动和退出内部循环 的通知?
这个通知不一定是消息,也可以是回调或其它方式。
当然,可能不是所有情况都能得到通知(例如用户自建的循环),
那系统api(domodal、messagebox、tracepopupmenu等)启动的循环 是否能得到?
如果都用mfc提供的api,又能否得到?

解决方案 »

  1.   

    某些界面api内部又会启动一个消息循环,直到满足一定条件才退出。
    例如:对话框的DoModal,消息框的MessageBox,菜单的 TracePopupMenu这些都是窗口,有自己的消息循环,不占用其它窗口的消息循环
    mfc是消息分发的机制
      

  2.   

    不知 1 楼指的“每个窗口都有”的“消息循环”是什么?消息队列一个线程里只有一个,
    而我说的消息循环是指类似以下的代码。while( GetMessage(...) ){
      TranslateMessage(...);
      DispatchMessage(...);
    }大部分程序只有一个且放在最外层(例如WinMain)但上面提到的DoModal内部却是另起循环的,直到对话框结束才退出。
    我的问题是,能否得知“另起循环”这样的事件或通知?
      

  3.   

    孩纸 自己多思考问题就解决了。把
    GetMessage(...) 
    DispatchMessage(...);
    的while循环拆开,放在线程过程的不同地方,同样也是消息循环。
    同样,把消息循环拷贝一份 放到其他地方,就知道为线程什么会卡在其它窗口消息中了,
    得到通知很简单,SetWindowsHookEx,这些都是windows编程书本的东西
      

  4.   

    3楼的朋友,明白你的意思,我知道消息循环是到处都可以写的。不过我问题是,别的地方另起循环能否得到通知。
    5楼的朋友,我也是这样理解的。只是阻塞消息不尽相同,对话框才会阻塞键盘鼠标,而菜单则一失去焦点就退出循环。另起循环,从系统的角度看就是消息处理程序还未完成,又来取下一条消息。。但对于处理中又sendmessage的也有类似情况,通用情况无法检查。那放窄一点,对于DoModal、MessageBox、TracePopupMenu之类,是否有办法知道它们启动、退出消息循环的时机?
    最好是在最基层的地方得到(这就可以做成单独模块用在任何程序中),而不必和具体窗口布局联系。
    钩子的方式,前提是这个事件会触发消息吧?还是说监测所有消息自己判断?恳请指教。