DirectInput -> Keyboard -> GetDeviceState

Arjen Nienhuis arjen at BleHQ.org
Thu Feb 21 21:06:25 CST 2002


The MapVirtualKey in GetDeviceState is not "the way to do it". It does 
not map VK_?? to DIK_??. I don't know why it does work most of the time.
"ptr[i] = 0x80; ptr[i + 0x80] = 0x80;" gave double key events in a game 
I have.

The correct way to convert the keys is by this table (attachment).
I made this table by pressing all the keys on my keyboard, and record 
the keycodes.

The code I wrote for this function is:

static HRESULT WINAPI SysKeyboardAImpl_GetDeviceState(
         LPDIRECTINPUTDEVICE2A iface, DWORD len, LPVOID ptr
)
{
     DWORD i;
     memset( ptr, 0, len );
     if (len != 256)
     {
         WARN("whoops, got len %ld?\n", len);
         return DI_OK;
     }

     for (i = 0; i < (sizeof(vk_to_dik) / sizeof(vk_to_dik[0])); i++)
       if (GetAsyncKeyState( vk_to_dik[i][0] ) & 0x8000)
         ((LPBYTE)ptr)[ vk_to_dik[i][1] ] = 0x80;

     return DI_OK;
}

Is there an array_size() macro in wine?
where should I put this table?
Any other comments about my first usefull (at least for me) wine code?
-------------- next part --------------
unsigned char vk_to_dik[][2] =
{
  {VK_BACK, DIK_BACK},
  {VK_TAB, DIK_TAB},
  {VK_CLEAR, DIK_NUMPAD5},      /* Num Lock off */
  {VK_RETURN, DIK_NUMPADENTER},
  {VK_SHIFT, DIK_LSHIFT},
  {VK_CONTROL, DIK_LCONTROL},
  {VK_MENU, DIK_LMENU},
  {VK_CAPITAL, DIK_CAPITAL},
  {VK_ESCAPE, DIK_ESCAPE},
  {VK_SPACE, DIK_SPACE},
  {VK_PRIOR, DIK_PRIOR},
  {VK_NEXT, DIK_NEXT},
  {VK_END, DIK_END},
  {VK_HOME, DIK_HOME},
  {VK_LEFT, DIK_LEFT},
  {VK_UP, DIK_UP},
  {VK_RIGHT, DIK_RIGHT},
  {VK_DOWN, DIK_DOWN},
  {VK_INSERT, DIK_INSERT},
  {VK_DELETE, DIK_DELETE},
  {VK_0, DIK_0},
  {VK_1, DIK_1},
  {VK_2, DIK_2},
  {VK_3, DIK_3},
  {VK_4, DIK_4},
  {VK_5, DIK_5},
  {VK_6, DIK_6},
  {VK_7, DIK_7},
  {VK_8, DIK_8},
  {VK_9, DIK_9},
  {VK_A, DIK_A},
  {VK_B, DIK_B},
  {VK_C, DIK_C},
  {VK_D, DIK_D},
  {VK_E, DIK_E},
  {VK_F, DIK_F},
  {VK_G, DIK_G},
  {VK_H, DIK_H},
  {VK_I, DIK_I},
  {VK_J, DIK_J},
  {VK_K, DIK_K},
  {VK_L, DIK_L},
  {VK_M, DIK_M},
  {VK_N, DIK_N},
  {VK_O, DIK_O},
  {VK_P, DIK_P},
  {VK_Q, DIK_Q},
  {VK_R, DIK_R},
  {VK_S, DIK_S},
  {VK_T, DIK_T},
  {VK_U, DIK_U},
  {VK_V, DIK_V},
  {VK_W, DIK_W},
  {VK_X, DIK_X},
  {VK_Y, DIK_Y},
  {VK_Z, DIK_Z},
  {VK_LWIN, DIK_LWIN},
  {VK_RWIN, DIK_RWIN},
  {VK_APPS, DIK_APPS},
  {VK_NUMPAD0, DIK_NUMPAD0},
  {VK_NUMPAD1, DIK_NUMPAD1},
  {VK_NUMPAD2, DIK_NUMPAD2},
  {VK_NUMPAD3, DIK_NUMPAD3},
  {VK_NUMPAD4, DIK_NUMPAD4},
  {VK_NUMPAD5, DIK_NUMPAD5},      /* Num Lock on */
  {VK_NUMPAD6, DIK_NUMPAD6},
  {VK_NUMPAD7, DIK_NUMPAD7},
  {VK_NUMPAD8, DIK_NUMPAD8},
  {VK_NUMPAD9, DIK_NUMPAD9},
  {VK_MULTIPLY, DIK_MULTIPLY},
  {VK_ADD, DIK_ADD},
  {VK_SUBTRACT, DIK_SUBTRACT},
  {VK_DECIMAL, DIK_DECIMAL},
  {VK_DIVIDE, DIK_DIVIDE},
  {VK_F1, DIK_F1},
  {VK_F2, DIK_F2},
  {VK_F3, DIK_F3},
  {VK_F4, DIK_F4},
  {VK_F5, DIK_F5},
  {VK_F6, DIK_F6},
  {VK_F7, DIK_F7},
  {VK_F8, DIK_F8},
  {VK_F9, DIK_F9},
  {VK_F10, DIK_F10},
  {VK_F11, DIK_F11},
  {VK_F12, DIK_F12},
  {VK_NUMLOCK, DIK_NUMLOCK},
  {VK_SCROLL, DIK_SCROLL},
  {VK_OEM_1, DIK_SEMICOLON},
  {VK_OEM_PLUS, DIK_EQUALS},
  {VK_OEM_COMMA, DIK_COMMA},
  {VK_OEM_MINUS, DIK_MINUS},
  {VK_OEM_PERIOD, DIK_PERIOD},
  {VK_OEM_2, DIK_SLASH},
  {VK_OEM_3, DIK_GRAVE},
  {VK_OEM_4, DIK_LBRACKET},
  {VK_OEM_5, DIK_BACKSLASH},
  {VK_OEM_6, DIK_RBRACKET},
  {VK_OEM_7, DIK_APOSTROPHE}
};


More information about the wine-devel mailing list