gpt4 book ai didi

c - WinAPI 文档自相矛盾?

转载 作者:太空宇宙 更新时间:2023-11-04 01:46:22 25 4
gpt4 key购买 nike

所以我一直在浏览 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);
}

最佳答案

你不是在比较同类。文档指出,如果 hWnd 无效,则返回 -1

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

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

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

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

正在传递变量 hWnd,因此可能会出现错误。

关于c - WinAPI 文档自相矛盾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53144557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com