某些界面api内部又会启动一个消息循环,直到满足一定条件才退出。
例如:对话框的DoModal,消息框的MessageBox,菜单的 TracePopupMenu
mfc的CSocket的“同步阻塞”也用类似方式来模拟。
这样从使用者角度来看,这些api好像是阻塞的,有结果才返回。但消息队列依然运转,界面不会卡住。我的问题是,能否得到 启动和退出内部循环 的通知?
这个通知不一定是消息,也可以是回调或其它方式。
当然,可能不是所有情况都能得到通知(例如用户自建的循环),
那系统api(domodal、messagebox、tracepopupmenu等)启动的循环 是否能得到?
如果都用mfc提供的api,又能否得到?
例如:对话框的DoModal,消息框的MessageBox,菜单的 TracePopupMenu
mfc的CSocket的“同步阻塞”也用类似方式来模拟。
这样从使用者角度来看,这些api好像是阻塞的,有结果才返回。但消息队列依然运转,界面不会卡住。我的问题是,能否得到 启动和退出内部循环 的通知?
这个通知不一定是消息,也可以是回调或其它方式。
当然,可能不是所有情况都能得到通知(例如用户自建的循环),
那系统api(domodal、messagebox、tracepopupmenu等)启动的循环 是否能得到?
如果都用mfc提供的api,又能否得到?
解决方案 »
- Runtime Error 错误
- AfxGetMainWnd() 并没有获得窗口的句柄,请教!
- 求助:关于CFile::Read函数的问题
- 很多com组件都是光有接口(dispinterface),但是没有实现该接口的类(coclass)
- 请问如何用VC检测计算机中的DirectX的版本
- IE的安全级别被禁止了,"自定义级别"按钮是灰色的,不可用,怎么办?
- 诚聘VC程序员(武汉)
- WideCharToMultiByte,怎么把UNICODE转换成ASCII
- openssl 中进行AES加密 密钥如何获取
- MDI程序问题多多,请指教。
- 利用PreTranslateMessage(MSG* pMsg)响应回车事件被多次执行
- VC怎么打开系统消息框“windows无法打开此文件。。。。。请选择一个程序来打开”
例如:对话框的DoModal,消息框的MessageBox,菜单的 TracePopupMenu这些都是窗口,有自己的消息循环,不占用其它窗口的消息循环
mfc是消息分发的机制
而我说的消息循环是指类似以下的代码。while( GetMessage(...) ){
TranslateMessage(...);
DispatchMessage(...);
}大部分程序只有一个且放在最外层(例如WinMain)但上面提到的DoModal内部却是另起循环的,直到对话框结束才退出。
我的问题是,能否得知“另起循环”这样的事件或通知?
GetMessage(...)
DispatchMessage(...);
的while循环拆开,放在线程过程的不同地方,同样也是消息循环。
同样,把消息循环拷贝一份 放到其他地方,就知道为线程什么会卡在其它窗口消息中了,
得到通知很简单,SetWindowsHookEx,这些都是windows编程书本的东西
5楼的朋友,我也是这样理解的。只是阻塞消息不尽相同,对话框才会阻塞键盘鼠标,而菜单则一失去焦点就退出循环。另起循环,从系统的角度看就是消息处理程序还未完成,又来取下一条消息。。但对于处理中又sendmessage的也有类似情况,通用情况无法检查。那放窄一点,对于DoModal、MessageBox、TracePopupMenu之类,是否有办法知道它们启动、退出消息循环的时机?
最好是在最基层的地方得到(这就可以做成单独模块用在任何程序中),而不必和具体窗口布局联系。
钩子的方式,前提是这个事件会触发消息吧?还是说监测所有消息自己判断?恳请指教。