On Thu, 2005-04-14 at 15:53 +0200, Alexandre Julliard wrote: > Jose Alonso <[EMAIL PROTECTED]> writes: > > > for (;;) > > { > > (1) if (PeekMessageW( &msg, 0, 0, 0, PM_NOREMOVE )) > > ... > > { > > (2) DispatchMessageW( &msg ); > > } > > if (!fEndMenu) fRemove = TRUE; > > > > /* finally remove message from the queue */ > > > > if (fRemove && !(mt.trackFlags & TF_SKIPREMOVE) ) > > (3) PeekMessageW( &msg, 0, msg.message, msg.message, PM_REMOVE ); > > else mt.trackFlags &= ~TF_SKIPREMOVE; > > } > > > > (1) The WM_TIMER is peeked and the timer is not restarted (PM_NOREMOVE) > > (2) The WM_TIMER is dispatched here > > (3) The WM_TIMER is only removed from the queue. > > The next PeekMessageW (1) return immediately with WM_TIMER since the > > timer was not restarted. > > The timer was restarted in (3), so I'd expect things to work right. > There must be something else going on here. >
The timer was not restarted in (3), because the message is removed in remove_queue_message. DECL_HANDLER(get_message) ... if (get_posted_message( queue, ... ... get_posted_message ... remove_queue_message( queue, msg, POST_MESSAGE ); I think that another solution would be to check in the remove_queue_message if the message is WM_TIMER or WM_SYSTIMER and restart the corresponding timer. alonso