1、作用
等待,直到一个或所有指定的对象处于信号状态或超时间隔过去。这些对象可以包括输入事件对象,您可以使用dwWakeMask参数指定这些对象。
2、函数原型
DWORD MsgWaitForMultipleObjects(
[in] DWORD nCount,
[in] const HANDLE *pHandles,
[in] BOOL fWaitAll,
[in] DWORD dwMilliseconds,
[in] DWORD dwWakeMask
);
DWORD MsgWaitForMultipleObjectsEx(
[in] DWORD nCount,
[in] const HANDLE *pHandles,
[in] DWORD dwMilliseconds,
[in] DWORD dwWakeMask,
[in] DWORD dwFlags
);
[in] nCount
pHandles所指向的数组中的对象句柄数。对象句柄的最大数目为 MAXIMUM_WAIT_OBJECTS减去 1。如果此参数的值为零,则该函数仅等待输入事件。
[in] pHandles
对象句柄数组。有关可以指定其句柄的对象类型的列表,请参阅以下"备注"部分。数组可以包含不同类型的对象的句柄。它不能包含同一句柄的多个副本。
如果其中一个句柄在等待仍处于挂起状态时关闭,则函数的行为未定义。
[in] fWaitAll
如果此参数为 TRUE,则当pHandles数组中所有对象的状态都设置为已发出信号并已收到输入事件时,该函数将返回。如果此参数为 FALSE,则当任何一个对象的状态设置为信令或已收到输入事件时,该函数将返回。在这种情况下,返回值指示其状态导致函数返回的对象。
[in] dwMilliseconds
超时间隔,以毫秒为单位。如果指定了非零值,则该函数将一直等待,直到向指定的对象发出信号或间隔过去。如果dw毫秒为零,则在未向指定对象发出信号时,函数不会进入等待状态;它总是立即返回。如果dw毫秒为INFINITE,则函数只有在向指定的对象发出信号时才会返回。
[in] dwWakeMask
输入事件对象句柄将添加到对象句柄数组的输入类型。此参数可以是以下值的任意组合。
价值 | 意义 |
---|---|
QS_ALLEVENTS 0x04BF | 输入、WM_TIMER、WM_PAINT、WM_HOTKEY或发布的消息都在队列中。 此值是 QS_INPUT 、 QS_POSTMESSAGE、 QS_TIMER、 QS_PAINT和QS_HOTKEY的组合。 |
QS_ALLINPUT 0x04FF | 任何消息都在队列中。 此值是QS_INPUT、 QS_POSTMESSAGE、 QS_TIMER、 QS_PAINT、 QS_HOTKEY和QS_SENDMESSAGE的组合。 |
QS_ALLPOSTMESSAGE 0x0100 | 队列中有已发布的消息。 当您调用GetMessage或PeekMessage而不筛选邮件时,将清除此值。 |
QS_HOTKEY 0x0080 | 队列中有WM_HOTKEY消息。 |
QS_INPUT 0x407 | 输入消息在队列中。 此值是 QS_MOUSE 、 QS_KEY和QS_RAWINPUT的组合。 |
QS_KEY 0x0001 | WM_KEYUP、WM_KEYDOWN、WM_SYSKEYUP或WM_SYSKEYDOWN消息都在队列中。 |
QS_MOUSE 0x0006 | WM_MOUSEMOVE消息或鼠标按钮消息(WM_LBUTTONUP、WM_RBUTTONDOWN等)。 此值是QS_MOUSEMOVE和QS_MOUSEBUTTON的组合。 |
QS_MOUSEBUTTON 0x0004 | 鼠标按钮消息(WM_LBUTTONUP、WM_RBUTTONDOWN等)。 |
QS_MOUSEMOVE 0x0002 | 队列中有WM_MOUSEMOVE消息。 |
QS_PAINT 0x0020 | 队列中有WM_PAINT消息。 |
QS_POSTMESSAGE 0x0008 | 队列中有已发布的消息。 |
QS_RAWINPUT 0x0400 | 原始输入消息位于队列中。 |
QS_SENDMESSAGE 0x0040 | 队列中包含由其他线程或应用程序发送的消息。 |
QS_TIMER 0x0010 | 队列中有WM_TIMER消息。 |
MsgWaitForMultipleObjectsEx参数:[in] dwFlags
价值 | 意义 |
---|---|
0 | 当任何一个对象收到信号时,该函数将返回。返回值指示其状态导致函数返回的对象。 |
MWMO_ALERTABLE 0x0002 | 如果 APC 在线程处于等待状态时已排队到具有QueueUserAPC的线程,则该函数也会返回。 |
MWMO_INPUTAVAILABLE 0x0004 | 如果队列存在输入,则该函数将返回,即使已使用对另一个函数(如PeekMessage)的调用看到(但未删除)输入也是如此。 |
MWMO_WAITALL 0x0001 | 当pHandles数组中的所有对象都同时收到信号并收到输入事件时,该函数将返回。 |
3、返回值
返回代码/值 | 描述 |
---|---|
WAIT_OBJECT_0到 (WAIT_OBJECT_0 + nCount– 1) | 如果bWaitAll 为 TRUE,则指定范围内的返回值表示所有指定对象的状态都已发出信号。如果bWaitAll 为 FALSE,则返回值减去WAIT_OBJECT_0表示满足等待的对象的pHandles数组索引。 |
WAIT_OBJECT_0 + nCount | dwWakeMask参数中指定的类型的新输入在线程的输入队列中可用。诸如 PeekMessage、GetMessage和 WaitMessage等函数会将队列中的消息标记为旧消息。因此,在调用这些函数之一后,对MsgWaitForMultipleObjects的后续调用将不会返回,直到指定类型的新输入到达。 在发生需要线程操作的系统事件(如前台激活)时,也会返回此值。因此,MsgWaitForMultipleObjects可以返回,即使没有适当的输入可用,即使dwWakeMask设置为 0。如果发生这种情况,请调用GetMessage或PeekMessage来处理系统事件,然后再次尝试调用MsgWaitForMultipleObjects。 |
WAIT_ABANDONED_0到 (WAIT_ABANDONED_0 + nCount– 1) | 如果bWaitAll 为 TRUE,则指定范围内的返回值表示所有指定对象的状态都已发出信号,并且其中至少有一个对象是废弃的互斥体对象。如果bWaitAll 为 FALSE,则返回值减去WAIT_ABANDONED_0表示满足等待的废弃互斥对象的pHandles数组索引。互斥对象的所有权授予调用线程,互斥体设置为非信号。 如果互斥体正在保护持久状态信息,则应检查其一致性。 |
WAIT_TIMEOUT 258L | 未满足经过的超时间隔以及bWaitAll和dwWakeMask参数指定的条件。 |
WAIT_FAILED 0xFFFFFFFF | 函数已失败。 |