diff --git a/win32ss/user/ntuser/message.c b/win32ss/user/ntuser/message.c index e0f4f987678..83136685dcf 100644 --- a/win32ss/user/ntuser/message.c +++ b/win32ss/user/ntuser/message.c @@ -1310,6 +1310,35 @@ co_IntGetPeekMessage( PMSG pMsg, co_HOOK_CallHooks( WH_GETMESSAGE, HC_ACTION, RemoveMsg & PM_REMOVE, (LPARAM)pMsg); + /* --- Begin afKeyState update block --- */ + if ((RemoveMsg & PM_REMOVE) && + (pMsg->message == WM_KEYDOWN || pMsg->message == WM_KEYUP || + pMsg->message == WM_SYSKEYDOWN || pMsg->message == WM_SYSKEYUP)) + { + BYTE vk = (BYTE)pMsg->wParam; + BYTE state = pti->MessageQueue->afKeyState[vk]; + + /* Bit 7 = key down */ + if (pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN) + state |= 0x80; + else + state &= ~0x80; + + /* Bit 0 = toggle state, for toggle keys only */ + if (vk == VK_NUMLOCK || vk == VK_CAPITAL || vk == VK_SCROLL) + { + if (GetAsyncKeyState(vk) & 0x01) + state |= 0x01; + else + state &= ~0x01; + } + + pti->MessageQueue->afKeyState[vk] = state; + + TRACE("Updated afKeyState[%02X] = 0x%02X\n", vk, state); + } + /* --- End afKeyState update block --- */ + if ( bGMSG || pMsg->message == WM_PAINT) break; }