Handle posted internal messages directly in PeekMessageW to avoid
having to return them to the application. Call NtYieldExecution for nicer behavior when PM_NOYIELD is not specified.
This commit is contained in:
parent
d1a36e1929
commit
fc2bd2324e
|
@ -2672,15 +2672,26 @@ BOOL WINAPI PeekMessageW( MSG *msg_out, HWND hwnd, UINT first, UINT last, UINT f
|
||||||
|
|
||||||
hwnd = WIN_GetFullHandle( hwnd );
|
hwnd = WIN_GetFullHandle( hwnd );
|
||||||
|
|
||||||
if (!peek_message( &msg, hwnd, first, last, (flags & PM_REMOVE) ? GET_MSG_REMOVE : 0 ))
|
for (;;)
|
||||||
{
|
{
|
||||||
if (!(flags & PM_NOYIELD))
|
if (!peek_message( &msg, hwnd, first, last, (flags & PM_REMOVE) ? GET_MSG_REMOVE : 0 ))
|
||||||
{
|
{
|
||||||
DWORD count;
|
if (!(flags & PM_NOYIELD))
|
||||||
ReleaseThunkLock(&count);
|
{
|
||||||
if (count) RestoreThunkLock(count);
|
DWORD count;
|
||||||
|
ReleaseThunkLock(&count);
|
||||||
|
NtYieldExecution();
|
||||||
|
if (count) RestoreThunkLock(count);
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
return FALSE;
|
if (msg.message & 0x80000000)
|
||||||
|
{
|
||||||
|
handle_internal_message( msg.hwnd, msg.message, msg.wParam, msg.lParam );
|
||||||
|
if (!(flags & PM_REMOVE)) /* have to remove it explicitly */
|
||||||
|
peek_message( &msg, msg.hwnd, msg.message, msg.message, GET_MSG_REMOVE );
|
||||||
|
}
|
||||||
|
else break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((queue = QUEUE_Current()))
|
if ((queue = QUEUE_Current()))
|
||||||
|
@ -2863,9 +2874,6 @@ LONG WINAPI DispatchMessageA( const MSG* msg )
|
||||||
msg->message, msg->wParam, GetTickCount() );
|
msg->message, msg->wParam, GetTickCount() );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (msg->message & 0x80000000)
|
|
||||||
return handle_internal_message( msg->hwnd, msg->message, msg->wParam, msg->lParam );
|
|
||||||
|
|
||||||
if (!(wndPtr = WIN_GetPtr( msg->hwnd )))
|
if (!(wndPtr = WIN_GetPtr( msg->hwnd )))
|
||||||
{
|
{
|
||||||
if (msg->hwnd) SetLastError( ERROR_INVALID_WINDOW_HANDLE );
|
if (msg->hwnd) SetLastError( ERROR_INVALID_WINDOW_HANDLE );
|
||||||
|
@ -2938,9 +2946,6 @@ LONG WINAPI DispatchMessageW( const MSG* msg )
|
||||||
msg->message, msg->wParam, GetTickCount() );
|
msg->message, msg->wParam, GetTickCount() );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (msg->message & 0x80000000)
|
|
||||||
return handle_internal_message( msg->hwnd, msg->message, msg->wParam, msg->lParam );
|
|
||||||
|
|
||||||
if (!(wndPtr = WIN_GetPtr( msg->hwnd )))
|
if (!(wndPtr = WIN_GetPtr( msg->hwnd )))
|
||||||
{
|
{
|
||||||
if (msg->hwnd) SetLastError( ERROR_INVALID_WINDOW_HANDLE );
|
if (msg->hwnd) SetLastError( ERROR_INVALID_WINDOW_HANDLE );
|
||||||
|
|
Loading…
Reference in New Issue