winapi - 处理多个windows WIN32 API

标签 winapi loops message

你好 我正在尝试在包含多个窗口的 Win32 环境中创建一个应用程序。 我怎么做?我在网上找到的所有 Win32 教程都只展示了如何管理一个窗口。 如何创建第二个窗口,以及如何一起处理它们的消息? (我知道我应该只有一个消息循环)

感谢!

最佳答案

您的消息循环为在当前线程上创建的所有窗口获取并分派(dispatch)消息。

这样一个简单的消息循环就足够了。

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

否则,要在线程上创建窗口,您只需根据需要/需要多次调用 CreateWindow(...) 来构建您的 UI。

警告:在许多简单程序中常见的模式是在 WindowProc 中处理 WM_DESTROY 以调用 PostQuitMessage()。 PostQuitMessage() 向线程发送一条消息,告诉消息循环退出。这将终止应用程序,销毁线程上的所有窗口。如果你有一个主应用程序窗口,如果关闭,应该退出应用程序,只有那个窗口应该调用 PostQuitMessage。如果您有两个(或更多)可以按任意顺序关闭的窗口,那么您需要保持打开窗口的计数,并仅在用户关闭最后一个窗口时调用 PostQuitMessage。

确实,任何演示对话框的示例程序也演示了如何在线程上创建多个窗口,因为对话框上的每个控件也是一个带有 windowproc 的窗口。

许多新的 Windows 开发人员陷入了试图为特定窗口过滤消息的陷阱:

  while(GetMessage(&msg,hwnd,0,0,0)...

这是错误的,因为它会阻止任何子窗口获取它们的消息。许多实用程序库将在线程上创建隐藏窗口并使用它们从其他进程/线程接收消息 - 仅过滤应用程序窗口的消息会导致消息队列增长,并且其他事情会以奇怪的不寻常方式失败.将 NULL 传递给 hwnd,直到您完全理解为什么您可能要暂时过滤特定窗口的消息。

关于winapi - 处理多个windows WIN32 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1707918/

相关文章:

c++ - FormatMessage 中是否有明确定义的大小限制?

c++ - 文件映射和文件结构

arrays - Perl:对数组使用条件

c++ - 如何从另一个窗口/程序发送/接收消息?

ios - SMS 打开消息

security - Win32 : bypassing UAC using user/password

c++ - 获取 Windows 启动消息的语言

java - 如果数组未满,则在末尾添加一个值

php - 特殊类别帖子的不同循环

MySQL 按 2 列分组