http://bugs.winehq.org/show_bug.cgi?id=30814
bshalm@broadpark.no changed:
What |Removed |Added ---------------------------------------------------------------------------- CC| |bshalm@broadpark.no
--- Comment #11 from bshalm@broadpark.no 2013-04-07 16:34:32 CDT --- I think the problem is that GetKeyboardState after ALT-TAB returns the 0x40 bit! GetKeyboardState documentation only documents LSB and MSB, so maybe they just do something like "if (state[VK_LEFT])"
I modified the code to remove everything but LSB and MSB, now it is almost perfect: If I ALT-TAB while holding a scrollkey, it will continue scrolling until I hit that key again.
BOOL WINAPI DECLSPEC_HOTPATCH GetKeyboardState( LPBYTE state ) { BOOL ret; BOOL yo; int i;
TRACE("(%p)\n", state);
memset( state, 0, 256 ); SERVER_START_REQ( get_key_state ) { req->tid = GetCurrentThreadId(); req->key = -1; wine_server_set_reply( req, state, 256 ); ret = !wine_server_call_err( req ); } SERVER_END_REQ;
yo = state[VK_LEFT] || state[VK_UP] || state[VK_RIGHT] || state[VK_DOWN];
if (yo) ERR("not-fixed: l=%02x u=%02x r=%02x d=%02x\n", state[VK_LEFT], state[VK_UP], state[VK_RIGHT], state[VK_DOWN]);
for (i = 0; i < 256; ++i) state[i] &= 0x81; // remove everything but LSB and MSB!
if (yo) ERR(" fixed: l=%02x u=%02x r=%02x d=%02x\n", state[VK_LEFT], state[VK_UP], state[VK_RIGHT], state[VK_DOWN]);
return ret; }
*before alt-tab* err:win:GetKeyboardState fixed: l=00 u=00 r=80 d=01 err:win:GetKeyboardState not-fixed: l=00 u=81 r=80 d=01 err:win:GetKeyboardState fixed: l=00 u=81 r=80 d=01 err:win:GetKeyboardState not-fixed: l=00 u=81 r=80 d=01 err:win:GetKeyboardState fixed: l=00 u=81 r=80 d=01 *after alt-tab* err:win:GetKeyboardState not-fixed: l=40 u=41 r=40 d=00 err:win:GetKeyboardState fixed: l=00 u=01 r=00 d=00 err:win:GetKeyboardState not-fixed: l=40 u=41 r=40 d=00 err:win:GetKeyboardState fixed: l=00 u=01 r=00 d=00 err:win:GetKeyboardState not-fixed: l=40 u=41 r=40 d=00 err:win:GetKeyboardState fixed: l=00 u=01 r=00 d=00