消息重入是如何产生的?工作原理?

CowWu 2003-03-26 03:29:15
rt
...全文
94 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
arxing 2003-03-27
  • 打赏
  • 举报
回复
它把父窗口除了WM_PAINT以外的消息都给屏蔽了,当然,你可以选择确定父窗口可以处理某些消息。
arxing 2003-03-27
  • 打赏
  • 举报
回复
漏了补充,如果在消息处理函数里面进行了消息循环,同样引起消息函数重入。
模式对话框就是包含了一个消息循环,如果你不想父窗口继续处理某些消息,你必须自己写消息循环,不要用API DialogBoxParam或者是MFC CDialog::Domodule()。
例如,这是我写的自定义的CWindowImpl<XXX>的DoModule方法
BOOL DoModule()
{
HWND hParent = ::GetActiveWindow();
Create(hParent);
CenterWindow();
::EnableWindow(hParent, FALSE);
ShowWindow(SW_RESTORE);
SetActiveWindow();
MSG msg;
while(TRUE)
{
while(::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(msg.message == WM_QUIT)
{
::EnableWindow(hParent, TRUE);
::SetActiveWindow(hParent);

return FALSE;
}
::GetMessage(&msg, NULL, 0, 0);
if(msg.message == hParent && msg.message != WM_PAINT)
{
continue;
}
::TranslateMessage(&msg);
::DispatchMessage(&msg);
if(!IsWindow())
{
::EnableWindow(hParent, TRUE);
::SetActiveWindow(hParent);
return TRUE;
}
}
else ::WaitMessage();
}
return FALSE;
}
hblsf 2003-03-26
  • 打赏
  • 举报
回复
看看SDK编程就知道了
arxing 2003-03-26
  • 打赏
  • 举报
回复
是由SendMessage引起的。
如果消息发送者线程与窗口线程相同,SendMessage会立即调用窗口消息处理函数,如同处理子函数一样。这就是所谓的消息重入的原因。
如果发送者线程跟窗口线程不一致,消息只在窗口线程调用PeekMessage或者GetMessage时才发送,这时候消息是不会重入的。
CowWu 2003-03-26
  • 打赏
  • 举报
回复
没人会吗?

15,979

社区成员

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

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