i forgot about this thread.

it seemed that both the WM_KEYDOWN and the WM_KEYUP message were triggering a WM_CHAR message - but sure why, maybe because I hadn't set the 30th bit of the WM_KEYUP lParam (haven't checked). Anyway - i just decided to send the WM_CHAR message instead.

Regarding PostMessage, that just sticks the message in the queue and it gets processed when it reaches the top - when you use the keyboard normally the messages are posted not sent (i believe) - so that's probably not the cause