Peekmessage(创建窗口循环)

Posted

技术标签:

【中文标题】Peekmessage(创建窗口循环)【英文标题】:Peekmessage (creating window loop) 【发布时间】: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 循环。

【问题讨论】:

你学了什么教程? 【参考方案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@ 窗口句柄和没有消息范围过滤器(我们这样做)。

以上是关于Peekmessage(创建窗口循环)的主要内容,如果未能解决你的问题,请参考以下文章

C++控制台程序怎样使主函数无限循环

Windows 消息循环

win32——消息循环 原理 函数 GetMessage PeekMessage TranslateMessage SendMessage PostMessage

如何检查我的窗口是不是隐藏/可见?

面试的问题 及回答

PeekMessage&GetMessage