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(创建窗口循环)的主要内容,如果未能解决你的问题,请参考以下文章
win32——消息循环 原理 函数 GetMessage PeekMessage TranslateMessage SendMessage PostMessage