-
消息获取方式
- GetMessage()
- 这个函数是一个阻塞式的消息获取函数。它会一直等待消息队列中有消息到来,当消息队列中没有消息时,线程会暂停执行(进入睡眠状态),直到有消息被放入消息队列。
- 例如,在一个简单的 Windows 应用程序的消息循环中,
GetMessage(&msg, NULL, 0, 0);会阻塞线程,直到获取到一个有效的消息(msg是MSG结构,用于存储消息相关信息)。
- PeekMessage()
- 这是一个非阻塞式的消息获取函数。它会检查消息队列中是否有消息,如果有消息就返回
TRUE并将消息存储在指定的MSG结构中;如果没有消息,它会立即返回FALSE,线程不会被阻塞,可以继续执行其他任务。 - 例如,
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);会检查消息队列,根据是否有消息来决定是否填充msg结构。
- 这是一个非阻塞式的消息获取函数。它会检查消息队列中是否有消息,如果有消息就返回
- GetMessage()
-
消息处理后的行为
- GetMessage()
- 当获取到一个消息后,
GetMessage()会根据消息的内容来决定后续操作。如果获取到的消息是WM_QUIT,它会返回FALSE,这通常会导致消息循环结束。对于其他消息,它会返回TRUE,并且消息循环可以继续处理该消息。
- 当获取到一个消息后,
- PeekMessage()
- 因为它只是检查消息队列而不改变消息循环的执行流程(除非返回
TRUE且进行了消息处理),所以即使获取到消息,也不会像GetMessage()那样自动决定是否结束消息循环。它需要在应用程序代码中根据返回值和消息内容来手动控制后续的处理流程。
- 因为它只是检查消息队列而不改变消息循环的执行流程(除非返回
- GetMessage()
-
消息移除方式
- GetMessage()
- 当
GetMessage()返回TRUE并获取到一个消息时,它会自动将该消息从消息队列中移除。这意味着下一次调用GetMessage()时,会获取消息队列中的下一个消息。
- 当
- PeekMessage()
- 可以通过参数来控制是否移除消息。如果使用
PM_REMOVE标志,PeekMessage()会在获取消息后将其从消息队列中移除,就像GetMessage()一样。但如果不使用这个标志,它只会检查消息的存在,而不会移除消息,这样消息仍然留在消息队列中,可以被后续的PeekMessage()或GetMessage()调用获取。
- 可以通过参数来控制是否移除消息。如果使用
- GetMessage()
-
应用场景
- GetMessage()
- 适用于传统的 Windows 消息循环,特别是在单线程的简单 Windows 应用程序中。它可以保证应用程序在没有消息时处于等待状态,有效地利用系统资源,并且按照消息到来的顺序依次处理消息。
- PeekMessage()
- 常用于需要在等待消息的同时执行其他后台任务的情况。例如,在一个游戏开发中,游戏循环可能会使用
PeekMessage()来检查是否有系统消息(如窗口大小改变、鼠标移动等),如果有就处理这些消息,同时在没有消息时继续执行游戏的逻辑更新和渲染等任务。
- 常用于需要在等待消息的同时执行其他后台任务的情况。例如,在一个游戏开发中,游戏循环可能会使用
- GetMessage()
06-15
1326
1326

被折叠的 条评论
为什么被折叠?



