【问题标题】:Peekmessage (creating window loop)Peekmessage(创建窗口循环)
【发布时间】:2013-04-29 08:25:03
【问题描述】:

我得到了这个错误,我不知道为什么,我只是正确地按照他的做法,他没有得到这个错误。这是代码。

 //Main application loop
        MSG msg = {0};
        while(WM_QUIT != msg.message())
        {
            if(PeekMessage(&msg, NULL, NULL, NULL, PM_Remove))
            {
                //Translate message
                TranslateMessage(&msg);
                
                //Dispatch message
                DispatchMessage(&msg);
            }
        }

这里是错误:

error C2064: term does not evaluate to a function taking 0 arguments
fatal error C1903: unable to recover from previous error(s); stopping compilation

当我点击它时,它们都指向 while 循环。

【问题讨论】:

  • 你学了什么教程?

标签: c++ windows


【解决方案1】:

MSG 结构的message 成员是一个字段,而不是一个方法。您应该访问它而不是调用它:

while (WM_QUIT != msg.message) {
    // ...
}

您的代码 sn-p 中还有其他问题。首先,C++ 是区分大小写的语言,所以PeekMessage() 的最后一个参数应该是PM_REMOVE 而不是PM_Remove

此外,如果消息队列为空,PeekMessage() 不会阻塞,因此您的代码最终会消耗 100% 的 CPU 内核。您可以改用GetMessage(),如果没有消息可用,它会阻塞,并允许您删除对WM_QUIT 的显式测试:

MSG msg = { 0 };
while (GetMessage(&msg, NULL, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

【讨论】:

  • @Hans,我想知道这是否是设计使然,但你是对的,这值得指出。
  • MSDN 建议使用while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0) 而不是直接检查GetMessage,因为返回值可以是<0 表示错误。
  • @Default,确实如此,但正如 Raymond Chen 在this article 中指出的那样,GetMessage() 在传递有效MSG 结构(我们有)的地址时永远不会失败,带有@ 987654338@ 窗口句柄和没有消息范围过滤器(我们这样做)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多