I’ve got a routine that looks something like this, in pseudocode:
while PeekMessage(Message, 0, 0, 0, PM_REMOVE)
HandleMessageAppropriately(Message)
Basically, it goes through and pulls all messages out of the queue and dispatches them. I can’t change this routine.
I’ve got a scenario in which this routine, if it’s being called under certain conditions and there’s a message in the queue representing the user having hit ESC at exactly the wrong moment, it can cause the program to crash. (Gotta love race conditions.)
I can’t change the routine above, but I can change the code that calls it. Is there any way that I can do something immediately before this is run that will say “go through the message queue and remove all keyboard input messages where the user hit ESC, without affecting the rest of the items in the queue or changing their order“?
You can use the range parameters in PeekMessage to restrict to the WM_CHAR message only, and PM_NOREMOVE to leave the message queue intact if the character isn’t
ESC; if the message needs to be removed, repeat the process with the PM_REMOVE flag. Unfortunately there’s no way to look past the first WM_CHAR in the queue.