SendMessage should be handles immediately, without going through the message queue like that.
Not if the window belongs to another thread. Pay special attention to the 4<sup>th</sup> paragraph of https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendm...:
If the specified window was created by the calling thread, the window procedure is called immediately as a subroutine. **If the specified window was created by a different thread, the system switches to that thread and calls the appropriate window procedure.** Messages sent between threads are processed only when the receiving thread executes message retrieval code.
[emphasis mine] ---
I wonder why it doesn't work.
Because sent messages (QS\_SENDMESSAGE) take priority over hardware (QS\_INPUT) messages. See server/queue.c, get\_messages handler. Posted messages (QS\_POSTMESSAGE) have the same problem. That is, we still need the WaitForSingleObject. My original proposal was to use SendMessage *in addition to* WaitForSingleObject, not replace it. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/5761#note_74743