diff --git a/dlls/user32/message.c b/dlls/user32/message.c index 3f0312a6ffd..79066a8c2b0 100644 --- a/dlls/user32/message.c +++ b/dlls/user32/message.c @@ -3671,6 +3671,16 @@ void WINAPI PostQuitMessage( INT exit_code ) SERVER_END_REQ; } +/* check for driver events if we detect that the app is not properly consuming messages */ +static inline void check_for_driver_events(void) +{ + if (get_user_thread_info()->message_count > 200) + { + flush_window_surfaces( FALSE ); + USER_Driver->pMsgWaitForMultipleObjectsEx( 0, NULL, 0, QS_ALLINPUT, 0 ); + } + else get_user_thread_info()->message_count++; +} /*********************************************************************** * PeekMessageW (USER32.@) @@ -3680,6 +3690,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH PeekMessageW( MSG *msg_out, HWND hwnd, UINT first, MSG msg; USER_CheckNotLock(); + check_for_driver_events(); if (!peek_message( &msg, hwnd, first, last, flags, 0 )) { @@ -3726,6 +3737,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetMessageW( MSG *msg, HWND hwnd, UINT first, UINT unsigned int mask = QS_POSTMESSAGE | QS_SENDMESSAGE; /* Always selected */ USER_CheckNotLock(); + check_for_driver_events(); if (first || last) { diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h index 3dc68c3302d..d743062f28e 100644 --- a/dlls/user32/user_private.h +++ b/dlls/user32/user_private.h @@ -172,7 +172,8 @@ struct wm_char_mapping_data struct user_thread_info { HANDLE server_queue; /* Handle to server-side queue */ - DWORD recursion_count; /* SendMessage recursion counter */ + WORD recursion_count; /* SendMessage recursion counter */ + WORD message_count; /* Get/PeekMessage loop counter */ BOOL hook_unicode; /* Is current hook unicode? */ HHOOK hook; /* Current hook */ struct received_message_info *receive_info; /* Message being currently received */ diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index 3b13b82c35a..e6b5194dbcb 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -1126,6 +1126,7 @@ static DWORD wait_message( DWORD count, CONST HANDLE *handles, DWORD timeout, DW { DWORD ret = USER_Driver->pMsgWaitForMultipleObjectsEx( count, handles, timeout, mask, flags ); if (ret == WAIT_TIMEOUT && !count && !timeout) NtYieldExecution(); + if ((mask & QS_INPUT) == QS_INPUT) get_user_thread_info()->message_count = 0; return ret; }