How do you get the character appropriate for the given KeyDown event in WPF?
private void UserControl1_KeyDown_1(object sender, KeyEventArgs e)
{
FieldInfo field = e.GetType().GetField
(
"_scanCode",
BindingFlags.NonPublic |
BindingFlags.Instance
);
Int32 scancode = (Int32)field.GetValue(e);
char c = (char)scancode;
}
Not all KeyDown events correspond to a single, visible character -- for instance, Backspace and Enter. You will have to compare the event arg's contents with what you want to associate. For example, on my US QUERTY keyboard, the key at the top left is a back-tick, but it might look like something else to another keyboard.
Try this:
var virtualKey = (uint)KeyInterop.VirtualKeyFromKey(e.Key);
var keyCode = MapVirtualKey(virtualKey, 0);
Import function MapVirtualKey
[DllImport("user32.dll")]
static extern uint MapVirtualKey(uint uCode, uint uMapType);
public enum MapType : uint
{
MAPVK_VK_TO_VSC = 0x0,
MAPVK_VSC_TO_VK = 0x1,
MAPVK_VK_TO_CHAR = 0x2,
MAPVK_VSC_TO_VK_EX = 0x3,
}
[DllImport("user32.dll")]
public static extern bool GetKeyboardState(byte[] lpKeyState);
[DllImport("user32.dll")]
public static extern uint MapVirtualKey(uint uCode, MapType uMapType);
[DllImport("user32.dll")]
public static extern int ToUnicode(
uint wVirtKey,
uint wScanCode,
byte[] lpKeyState,
[Out, MarshalAs(UnmanagedType.LPWStr, SizeParamIndex = 4)]
StringBuilder pwszBuff,
int cchBuff,
uint wFlags);
public static char GetCharFromKey(Key key)
{
char ch = ' ';
int virtualKey = KeyInterop.VirtualKeyFromKey(key);
byte[] keyboardState = new byte[256];
GetKeyboardState(keyboardState);
uint scanCode = MapVirtualKey((uint)virtualKey, MapType.MAPVK_VK_TO_VSC);
StringBuilder stringBuilder = new StringBuilder(2);
int result = ToUnicode((uint)virtualKey, scanCode, keyboardState, stringBuilder, stringBuilder.Capacity, 0);
switch (result)
{
case -1:
break;
case 0:
break;
case 1:
{
ch = stringBuilder[0];
break;
}
default:
{
ch = stringBuilder[0];
break;
}
}
return ch;
}