Hello. This is almost the same patch, which was posted to a news group, but with added TRACE's. It solves a problem with Lightwave, which does GetKeyboardState() + ToAscii(VK_?, 0, ...) on each WM_KEYDOWN message. Current code just ignores calls to ToAscii/ToUnicode if scanCode is 0. I'm not sure, but probably we should add a check for VK_MENU in lpKeyState and return 0 in that case? Patch also removes computing of AltGrMask, since we save and restore it on each key press event in any case. Changelog: Dmitry Timoshkov <dmitry@codeweavers.com> Allow ToAscii/ToUnicode work with scanCode = 0. --- cvs/hq/wine/windows/x11drv/keyboard.c Sat Nov 24 17:54:14 2001 +++ wine/windows/x11drv/keyboard.c Sat Feb 9 20:41:26 2002 @@ -997,12 +997,7 @@ int k; for (k = 0; k < keysyms_per_keycode; k += 1) - if (TSXKeycodeToKeysym(display, *kcp, k) == XK_Mode_switch) - { - AltGrMask = 1 << i; - TRACE_(key)("AltGrMask is %x\n", AltGrMask); - } - else if (TSXKeycodeToKeysym(display, *kcp, k) == XK_Num_Lock) + if (TSXKeycodeToKeysym(display, *kcp, k) == XK_Num_Lock) { NumLockMask = 1 << i; TRACE_(key)("NumLockMask is %x\n", NumLockMask); @@ -1506,12 +1501,6 @@ int keyc; BYTE lpChar[2]; - if (scanCode==0) { - /* This happens when doing Alt+letter : a fake 'down arrow' key press - event is generated by windows. Just ignore it. */ - TRACE("scanCode=0, doing nothing\n"); - return 0; - } if (scanCode & 0x8000) { TRACE("Key UP, doing nothing\n" ); @@ -1521,15 +1510,28 @@ e.keycode = 0; e.state = 0; if (lpKeyState[VK_SHIFT] & 0x80) + { + TRACE("ShiftMask = %04x\n", ShiftMask); e.state |= ShiftMask; + } if (lpKeyState[VK_CAPITAL] & 0x01) + { + TRACE("LockMask = %04x\n", LockMask); e.state |= LockMask; + } if (lpKeyState[VK_CONTROL] & 0x80) + { + TRACE("ControlMask = %04x\n", ControlMask); e.state |= ControlMask; + } if (lpKeyState[VK_NUMLOCK] & 0x01) + { + TRACE("NumLockMask = %04x\n", NumLockMask); e.state |= NumLockMask; + } /* Restore saved AltGr state */ + TRACE("AltGrMask = %04x\n", AltGrMask); e.state |= AltGrMask; TRACE_(key)("(%04X, %04X) : faked state = %X\n",