GetMessage当检测到系统消息队列中没有消息时,会先去判断有没有绘画消息,再判断有没有定时器消息,对吗
时间: 2024-03-14 17:49:44 浏览: 48
不完全正确。当GetMessage函数在检测系统消息队列时,如果队列中没有消息,它会检查当前线程的消息队列中是否有绘画消息(即WM_PAINT消息),如果有,则会立即返回该消息。这是因为绘画消息具有较高的优先级,Windows希望能够及时地处理这些消息,以保证界面的流畅和响应性。
如果消息队列中既没有绘画消息,也没有其他类型的消息,那么GetMessage函数会等待新消息的到来。在此期间,如果应用程序中有设置了定时器,Windows会检查定时器是否到期,如果到期了,则会为应用程序发送一个WM_TIMER消息,这个消息同样具有较高的优先级。
因此,可以说GetMessage函数在等待系统消息队列中的新消息时,会优先处理绘画消息和定时器消息,但是它并不会先去判断定时器消息是否存在,而是会按照WM_PAINT消息、WM_TIMER消息的优先级顺序处理这些消息。
相关问题
Windows GetMessage工作原理,GetMessage怎么去程序消息列队、系统消息队列获取消息的
Windows GetMessage函数是用于从消息队列中获取消息的函数。它的工作原理是,首先它会检查程序消息队列中是否有消息,如果有,就将其取出并返回;如果没有,则会检查系统消息队列中是否有消息,如果有,就将其取出并返回;如果两个队列中均没有消息,则GetMessage函数会将当前线程挂起,直到有新的消息到达为止。
要将消息放入程序消息队列,程序需要使用函数PostMessage或SendMessage向窗口发送消息。当消息到达后,Windows会将其添加到程序消息队列中,等待应用程序通过GetMessage函数来获取。
系统消息队列则包含了一些系统级别的消息,例如键盘和鼠标输入等。这些消息不是由应用程序发送的,而是由Windows系统生成的。GetMessage函数会检查这个队列是否有消息,如果有,就将其取出并返回。
总之,GetMessage函数是用于从消息队列中获取消息的函数,它会按照一定的优先级顺序从程序消息队列和系统消息队列中获取消息。
window c++ 如何从已有消息队列中获取消息
在 Windows C++ 中,可以使用以下函数从已有消息队列中获取消息:
```c++
BOOL GetMessage(
LPMSG lpMsg, // 指向MSG结构的指针
HWND hWnd, // 指定要接受消息的窗口句柄
UINT wMsgFilterMin,// 指定最小的消息值
UINT wMsgFilterMax,// 指定最大的消息值
);
```
该函数从指定窗口的消息队列中获取一条消息并将其存储在 `lpMsg` 指向的 `MSG` 结构中。如果函数成功,则返回非零值,否则返回零。
参数 `hWnd` 用于指定要接收消息的窗口句柄。如果想要接收所有窗口的消息,则可以将 `hWnd` 设置为 `NULL`。
参数 `wMsgFilterMin` 和 `wMsgFilterMax` 用于指定要接收的消息的范围。如果想要接收所有消息,则可以将它们都设置为零。
以下是一个示例:
```c++
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
// 处理消息
TranslateMessage(&msg);
DispatchMessage(&msg);
}
```
该示例中,通过循环调用 `GetMessage` 函数来不断获取消息并进行处理。其中,`TranslateMessage` 函数将键盘消息转换为字符消息,`DispatchMessage` 函数将消息分派给窗口过程进行处理。