How do you get the character appropriate for the given KeyDown event in WPF?
Asked
Active
Viewed 2,157 times
4 Answers
3
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;
}

Programer
- 1,005
- 3
- 22
- 46
2
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);

bartosz.lipinski
- 2,627
- 2
- 21
- 34
0
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;
}

Thomas Diemar
- 1
- 1
0
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.

Hank
- 8,289
- 12
- 47
- 57
-
I am aware of that. I was just looking for something similar to WinForm's KeyPress event. Something that provides a character if available. I found a work around, albeit messy. – Jordan Jan 27 '11 at 15:40