DirectInput -> Keyboard -> GetDeviceState
Arjen Nienhuis
arjen at BleHQ.org
Sat Feb 23 16:20:48 CST 2002
>>but I don't know if those are dependant on the keyboard layout. Do you?
>>
>
> I think they are.
>
You are right. Whit a different codepage DIK_BACKSLASH is not a
backslash at all.
What do you think of this?
--- wine/dlls/dinput/keyboard/main.c Thu Oct 18 23:30:06 2001
+++ main.c Sat Feb 23 23:07:52 2002
@@ -132,6 +132,51 @@
return 0;
}
+/* use MapVirtualKey for dik < 0x80
+ for dik >= 0x80 use this table.
+ MapVirtualKey returns the wrong values for the numpad,
+ so those are here also.
+*/
+struct {
+ BYTE dik;
+ BYTE vk;
+} dik_to_vk[] = {
+ {DIK_NUMPAD7, VK_NUMPAD7},
+ {DIK_NUMPAD8, VK_NUMPAD8},
+ {DIK_NUMPAD9, VK_NUMPAD9},
+ {DIK_SUBTRACT, VK_SUBTRACT},
+ {DIK_NUMPAD4, VK_NUMPAD4},
+ {DIK_NUMPAD5, VK_NUMPAD5}, /* Check both */
+ {DIK_NUMPAD5, VK_CLEAR}, /* Num Lock off */
+ {DIK_NUMPAD6, VK_NUMPAD6},
+ {DIK_ADD, VK_ADD},
+ {DIK_NUMPAD1, VK_NUMPAD1},
+ {DIK_NUMPAD2, VK_NUMPAD2},
+ {DIK_NUMPAD3, VK_NUMPAD3},
+ {DIK_NUMPAD0, VK_NUMPAD0},
+ {DIK_DECIMAL, VK_DECIMAL},
+ {0x56, VK_OEM_102},
+ {DIK_F11, VK_F11},
+ {DIK_F12, VK_F12},
+ {0x5E, 0x5E},
+ {0x5F, 0x5F},
+ {DIK_NUMPADENTER, VK_RETURN},
+ {DIK_DIVIDE, VK_DIVIDE},
+ {DIK_HOME, VK_HOME},
+ {DIK_UP, VK_UP},
+ {DIK_PRIOR, VK_PRIOR},
+ {DIK_LEFT, VK_LEFT},
+ {DIK_RIGHT, VK_RIGHT},
+ {DIK_END, VK_END},
+ {DIK_DOWN, VK_DOWN},
+ {DIK_NEXT, VK_NEXT},
+ {DIK_INSERT, VK_INSERT},
+ {DIK_DELETE, VK_DELETE},
+ {DIK_LWIN, VK_LWIN},
+ {DIK_RWIN, VK_RWIN},
+ {DIK_APPS, VK_APPS}
+};
+
static HRESULT WINAPI SysKeyboardAImpl_GetDeviceState(
LPDIRECTINPUTDEVICE2A iface,DWORD len,LPVOID ptr
)
@@ -144,13 +189,19 @@
WARN("whoops, got len %ld?\n", len);
return DI_OK;
}
- for (i = 0; i < 0x80; i++)
+ for (i = 0; i < DIK_NUMPAD7; i++)
{
WORD vkey = MapVirtualKeyA( i, 1 );
if (vkey && (GetAsyncKeyState( vkey ) & 0x8000))
{
((LPBYTE)ptr)[i] = 0x80;
- ((LPBYTE)ptr)[i | 0x80] = 0x80;
+ }
+ }
+ for (i = 0; i < (sizeof(dik_to_vk) / sizeof(dik_to_vk[0])); i++)
+ {
+ if (GetAsyncKeyState( dik_to_vk[i].vk ) & 0x8000)
+ {
+ ((LPBYTE)ptr)[dik_to_vk[i].dik] = 0x80;
}
}
return DI_OK;
More information about the wine-devel
mailing list