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
)
この関数はどのように見えますか?
私が選択する答えは、修飾子(、、)のオプションの組み合わせを使用して1つの「通常」をに変換する方法を提供する必要がありSystem.Windows.Forms.Keys
ます。複数の連続した呼び出しは、同じ文字になる必要があります。ハードコードされたキーボードレイアウトはありません。は、使用するレイアウトを定義します。Keys.Shift
Keys.Alt
Keys.Control
System.Char
InputLanguage
私がやろうとしていることを理解するための助けとして:与えられた(そして正しい)KeyPressEventArgs
だけでを生成します。KeyEventArgs
InputLangauge
デッドキーは影響しないはずFromKeys
です!