【发布时间】:2018-02-02 07:22:10
【问题描述】:
我正在尝试为我的项目创建独立的窗口包装类。它大部分都在工作,但无法弄清楚如何在我的主消息泵中获取 WM_QUIT。为了学习 Windows,我不想为此使用其他库。
这是正在发生的事情的一个简单示例。
#include <iostream>
#include <Windows.h>
void TestPump()
{
MSG msg = { 0 };
PostQuitMessage(0);
std::cout << "Posted WM_QUIT" << std::endl;
while (true)
{
BOOL result = PeekMessage(&msg, (HWND) -1, 0, 0, PM_REMOVE);
std::cout << "PeekMessage returned " << result << std::endl;
if (result == 0)
break;
if (WM_QUIT == msg.message)
std::cout << "got WM_QUIT" << std::endl;
}
}
void MakeWindow()
{
auto hwnd = CreateWindowEx(0, "Button", "dummy", 0, 0, 0, 32, 32, NULL, NULL, NULL, NULL);
std::cout << std::endl << "Created Window" << std::endl << std::endl;
}
int main()
{
TestPump();
MakeWindow();
TestPump();
std::cin.get();
return EXIT_SUCCESS;
}
PeekMessage 文档在这里:https://msdn.microsoft.com/en-us/library/windows/desktop/ms644943(v=vs.85).aspx
我无法找到任何使用 -1 HWND 过滤器的示例,但 MSDN 说它将接收 HWND 为 NULL 的线程消息(我已经检查过 WM_QUIT 是否如此),其中我相信 PostQuitMessage 与 WM_QUIT 有关系。
只有在创建窗口时才会出现问题。
我做错了什么,或者有更好的方法吗?
【问题讨论】:
-
我相信您在结束语中的意思是“功能”而不是“问题”。
-
仅供参考,我开始使用 WTL 而不是我自己的包装器,主要是因为我花在使用 Win32 玩 whackamole 的时间比实际编写应用程序的时间要多。 MFC 是一个更重量级的选择。
-
PeekMessage(&msg, (HWND)-1, 0, 0, PM_REMOVE)gotWM_QUITifPostQuitMessage(0);刚刚被调用 -
不应该像
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)这样调用来获取WM_QUIT吗? -
WM_QUIT不是真正的消息,它是设置在PeekMessage查找的线程上的标志。据推测,窗口过滤器会阻止它这样做。见blogs.msdn.microsoft.com/oldnewthing/20051104-33/?p=33453
标签: c++ oop winapi message-pump