WinAPI文档相互矛盾?

时间:2018-11-04 19:28:02

标签: c winapi

因此,我一直在浏览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);
}

1 个答案:

答案 0 :(得分:3)

您未将“喜欢”与“喜欢”进行比较。文档指出如果-1无效,则返回hWnd

在第一种情况下,循环正在传递NULL

while (GetMessage(&msg, NULL, 0, 0))

,因此无法返回-1。但是在第二个示例中

while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0)

正在传递变量hWnd,所以可能会有错误。