- Key identifiers in DirectInput are keyboard scan codes.
- Various international keyboards map scan codes differently, according to their layout.
- The same scan code can be translated to various ASCII codes, depending on the status of the shift key, and other such cases.
These are the steps we'll use:
- We'll use GetKeyboardLayout() to get the current keyboard layout.
- GetKeyboardState() will be used to retrieve the state of keys like shift, ctrl, alt, etc.
- Then using the current layout and scan code, using MapVirtualKeyEx() will give us a win32 virtual key (UINT type).
- The ToAsciiEx() function will finally convert the virtual key to 0 - 2 extended ASCII characters (unsigned short) Here's a sample function:
This returns the number of characters extracted. It will return 0 in the case that there was no conversion, or 1 or 2, depending multibyte character sets, for a valid output.static int scan2ascii(DWORD scancode, ushort* result)
{
static HKL layout=GetKeyboardLayout(0);
static uchar State[256];
if (GetKeyboardState(State)==FALSE)
return 0;
UINT vk=MapVirtualKeyEx(scancode,1,layout);
return ToAsciiEx(vk,scancode,State,result,0,layout);
}
In most cases, using char(result[0]) would provide the desired output.