为什么在Getmessage()创建消息队列之前需要peekMessage语句?
答案 0 :(得分:21)
这不是必需的。
但是,您有时会看到一个尚未准备好处理消息的线程,但它希望能够在其消息队列中接收它们。新线程没有消息队列,但调用PeekMessage
就足以创建消息队列。它会立即返回,因为没有消息,这允许线程继续自己准备好。与此同时,其他线程可以开始为新线程排队消息。一旦新线程准备就绪,它会调用GetMessage
以从队列中检索第一条消息,或等待将消息放入队列。
答案 1 :(得分:14)
不是。这两个函数做了不同的事情。
PeekMessage(...)不会等待消息出现 - 如果它在那里,它会获得第一个消息,也可以选择将其从队列中删除,但是在没有消息的情况下立即返回false。在等待消息时正在进行某些处理的应用程序中更常见,并且不能只是坐在那里等待下一条消息。实时游戏等很容易属于这一类。
GetMessage(...)等待直到有消息,然后获取它。它的CPUwise效率更高,因为它不会经常轮询,但如果没有任何消息,它会暂停。它在formy应用程序和其他程序中更常见,不需要进行持续的实时处理。
答案 2 :(得分:1)
使用PeekMessage
之前/代替GetMessage
有多种原因:
PeekMessage
标志的PM_REMOVE
来轮询消息队列并省略GetMessage
共。 PM_NOREMOVE
一起使用,并决定是否要处理和/或删除队列中的消息。 IsWindowUnicode
,然后选择PeekMessageA
或PeekMessageW
。