【发布时间】:2018-11-04 19:28:02
【问题描述】:
所以我一直在查看 Windows 文档,只是为了阅读一些内容并更广泛地了解 WinAPI 的工作原理等等,但是,我不禁注意到这样一个事实:在某些情况下,文档似乎自相矛盾,我需要确定哪种做事方式真的是正确的做事方式。我正在查看的具体示例涉及 GetMessage() 函数和“窗口消息循环”。
第一个站点 (Window Messages) 声明消息循环的正确语法如下...
MSG msg = { };
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
(如果您向下滚动,它就在页面底部附近的“已发布消息与已发送消息”标题之前)
文档解释说 WM_QUIT 消息会导致函数返回 0,这又会导致 while 循环中断和应用程序终止。否则,该函数将返回一个非零值,从而导致 while 循环继续。
第二个站点(The one for the GetMessage() function) 明确声明避免编写之前解释的代码。该站点表示 GetMessage() 函数可以在出错的情况下返回 -1 值,并且使用这样的代码
while (GetMessage( lpMsg, hWnd, 0, 0)) ...
如果函数返回 -1 将导致应用程序继续运行,即使它应该处理错误并正确终止。消息循环的有效实现应该是这样...
BOOL bRet;
while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
我一直都是这样做的,这样如果碰巧有一个错误,我就可以捕捉到 -1 错误。但是在看到微软基本上自己犯了所谓的错误之后,我现在很困惑。那么它是微软吗?这样做有效还是无效?
MSG msg = { };
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
【问题讨论】:
-
看来您使用的是正确的版本。
-
参见 MSDN 上的 When will GetMessage return -1?。