【问题标题】:Does a win32 application have one message loop? Or is it one message loop per window?win32 应用程序是否有一个消息循环?还是每个窗口一个消息循环?
【发布时间】:2013-08-07 18:51:58
【问题描述】:

我对消息循环在 win32 编程中的工作方式有点困惑。在我的WinMain 中,我总是输入以下内容:

while ( GetMessage ( &msg, NULL, 0, 0 ) > 0 )
{
    TranslateMessage ( &msg );
    DispatchMessage ( &msg );
}

这是一个 while 循环,它几乎会一直运行到您的应用程序停止为止。这是否意味着每个应用程序而不是每个窗口都有一个消息循环?

【问题讨论】:

  • 每个需要它的线程一个。您可以拥有由该线程驱动的任意数量的窗口。
  • 每个线程最多有一个消息队列。通常你只为每个消息队列设置一个消息循环。对话框使用嵌套的消息循环,大多数情况下对客户端是不可见的;暂时不用担心。 GetMessage 从线程的消息队列中返回第一条消息。 TranslateMessage 将虚拟键消息转换为字符消息(WM_CHARWM_DEADCHAR,...)。魔法发生在DispatchMessage 内部。它将消息传递到正确的窗口的窗口过程并管理所有内容,以便消息到达正确的接收者。

标签: c++ c winapi


【解决方案1】:

来自About Messages and Message Queues

具有多个线程的应用程序可以在创建窗口的每个线程中包含一个消息循环。

注意一个消息队列可以支持多个窗口...GetMessage 的第二个参数是您要查看消息的窗口句柄。如果NULL 则该线程的所有窗口。

作为第二个注意事项,可以在没有 Windows 的情况下创建消息队列(至少从 Windows 2000 开始)。在PostThreadMessage的文档中有描述:

在要发布消息的线程中,调用PeekMessage,如图所示强制系统创建消息队列。

PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)

【讨论】:

  • 酷。感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多