См. здесь для получения дополнительной информации о PostMessage. Каждое сообщение отличается и имеет свою спецификацию относительно того, какие параметры требуются. Во многих отношениях вы можете рассматривать ее как общую функцию с одним именем (почтовое сообщение), которая делегирует другой функции (имя сообщения) и передает ей эти параметры.
Последний параметр, как и остальные, зависит от сообщения и может варьироваться.
BOOL PostMessage(
__in HWND hWnd,
__in UINT Msg,
__in WPARAM wParam,
__in LPARAM lParam
);
В вашем первом сообщении WM_KEYDOWN нужен результат MapVirtualKey в lParam только в старших 16 битах. Я больше не знаком с этим сообщением, но я подозреваю, что происходит то, что, поскольку 0 передается как второй параметр, виртуального ключа для сканирования кода (или наоборот) не требуется, однако необходим код ключа все еще требуется в старших 16 битах lParam