因此,我一直在浏览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);
}
答案 0 :(得分:3)
您未将“喜欢”与“喜欢”进行比较。文档指出如果-1
无效,则返回hWnd
。
在第一种情况下,循环正在传递NULL
while (GetMessage(&msg, NULL, 0, 0))
,因此无法返回-1
。但是在第二个示例中
while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0)
正在传递变量hWnd
,所以可能会有错误。