Win32 API PeekMessage 函数如何工作

问题描述 投票:0回答:1

我尝试使用 Win32 API 进行编程,但遇到了一种我没有预料到的异常行为,这让我有点困惑。在我的 while 循环中:

while (IsWindow(hwnd)) {
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
        TranslateMessage(&msg); DispatchMessage(&msg);
    }

    OutputDebugStringA("loop continues\n");
}

只有当我不移动窗口时,一切都会按预期工作,但是当我尝试通过拖动标题栏来移动窗口时,循环由于某种原因不会继续。我认为这种情况正在发生,因为我正在尝试使用

PeekMessage
循环来实现
while
,但即使使用
if
语句也会显示相同的行为。

我想知道发生了什么以及如何才能执行循环的其余部分。我不知道消息队列和调度是如何工作的,所以我需要一些帮助。

c++ windows winapi message-loop peekmessage
1个回答
0
投票

在多种情况下,系统会为您启动模式消息循环。例如,当进入菜单或显示模式对话框时,就会发生这种情况。

在本例中,它是移动或调整大小模态循环(请参阅

WM_ENTERSIZEMOVE
消息)。这就是系统设计的工作方式。您的模态循环将“暂停”(通过嵌套模态循环),直到移动或调整大小操作结束。

© www.soinside.com 2019 - 2024. All rights reserved.