+int wxMSWEventLoopBase::GetNextMessageTimeout(WXMSG *msg, unsigned long timeout)
+{
+ // MsgWaitForMultipleObjects() won't notice any input which was already
+ // examined (e.g. using PeekMessage()) but not yet removed from the queue
+ // so we need to remove any immediately messages manually
+ //
+ // NB: using MsgWaitForMultipleObjectsEx() could simplify the code here but
+ // it is not available in very old Windows versions
+ if ( !::PeekMessage(msg, 0, 0, 0, PM_REMOVE) )
+ {
+ // we use this function just in order to not block longer than the
+ // given timeout, so we don't pass any handles to it at all
+ if ( ::MsgWaitForMultipleObjects
+ (
+ 0, NULL,
+ FALSE,
+ timeout,
+ QS_ALLINPUT
+ ) == WAIT_TIMEOUT )
+ {
+ return -1;
+ }
+
+ if ( !::PeekMessage(msg, 0, 0, 0, PM_REMOVE) )
+ {
+ wxFAIL_MSG( _T("PeekMessage() should have succeeded") );
+
+ return -1;
+ }
+ }
+
+ return msg->message != WM_QUIT;
+}
+
+