Translate Keys to char
See the question and my original answer on StackOverflowHere is a piece of code that seems to do what you're looking for - if I understood it correctly :-)
public static char? FromKeys(Keys keys, InputLanguage inputLanguage)
{
return FromKeys(keys, inputLanguage, true);
}
private static char? FromKeys(Keys keys, InputLanguage inputLanguage, bool firstChance)
{
if (inputLanguage == null)
{
inputLanguage = InputLanguage.CurrentInputLanguage;
}
byte[] keyStates = new byte[256];
const byte keyPressed = 0x80;
keyStates[(int)(keys & Keys.KeyCode)] = keyPressed;
keyStates[(int)Keys.ShiftKey] = ((keys & Keys.Shift) == Keys.Shift) ? keyPressed : (byte)0;
keyStates[(int)Keys.ControlKey] = ((keys & Keys.Control) == Keys.Control) ? keyPressed : (byte)0;
keyStates[(int)Keys.Menu] = ((keys & Keys.Alt) == Keys.Alt) ? keyPressed : (byte)0;
StringBuilder sb = new StringBuilder(10);
int ret = ToUnicodeEx(keys, 0, keyStates, sb, sb.Capacity, 0, inputLanguage.Handle);
if (ret == 1)
return sb[0];
if (ret == -1)
{
// dead letter
if (firstChance)
{
FromKeys(keys, inputLanguage, false);
}
return null;
}
return null;
}
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
private static extern int ToUnicodeEx(Keys wVirtKey, uint wScanCode, byte[] lpKeyState, StringBuilder pwszBuff, int cchBuff, uint wFlags, IntPtr dwhkl);