Я хочу перевести данный набор System.Windows.Forms.Keys
и System.Windows.Forms.InputLanguage
в соответствующий System.Char
.
Пробовал некоторые эксперименты с MapVirtualKeyEx
, но теперь есть способ рассмотреть состояние клавиатуры, и ToUnicodeEx
- боль с мертвыми клавишами .
Моя цель - функция ...
static char? FromKeys(Keys keys, InputLanguage inputLanguage)
{
// As I think what can be helpful and I got trying to find a solution for this problem:
Keys vkCode = keys & Keys.KeyCode;
Keys modifiers = keys & Keys.Modifiers;
byte[] keyboardState = new byte[256];
keyboardState[vkCode] = 1 << 7;
if (modifiers.HasFlag(Keys.Shift))
{
keyboardState[(int)Keys.ShiftKey] = 1 << 7;
}
if (modifiers.HasFlag(Keys.Control))
{
keyboardState[(int)Keys.ControlKey] = 1 << 7;
}
if (modifiers.HasFlag(Keys.Alt))
{
keyboardState[(int)Keys.Menu] = 1 << 7;
}
// [Put your code here]
}
... который должен называться так:
FromKeys(Keys.A | Keys.Shift, InputLanguage.CurrentInputLanguage); // = 'A'
FromKeys(Keys.Escape, InputLanguage.DefaultInputLanguage); // = null
FromKeys(Keys.Oemtilde, InputLanguage.FromCulture(new CultureInfo("de-DE"))); // = 'ö'
FromKeys(Keys.E | Keys.Control | Keys.Alt, InputLanguage.FromCulture(new CultureInfo("de-DE"))); // = '€'
(знать о Keys.Shift
и Keys.ShiftKey
!)
Как будет выглядеть эта функция?
Ответ, который я выберу, должен обеспечить способ перевода одного "нормального" System.Windows.Forms.Keys
с необязательной комбинацией модификаторов (Keys.Shift
, Keys.Alt
, Keys.Control
) в System.Char
, Несколько последовательных вызовов должны приводить к одному и тому же символу. Нет жестко закодированных раскладок клавиатуры, InputLanguage
определяет используемую раскладку.
В качестве помощи, чтобы понять, что я пытаюсь: Сгенерировать KeyPressEventArgs
только с заданным KeyEventArgs
(и правильным InputLangauge
).
Мертвые клавиши не должны влиять FromKeys
!