caplockの有無にかかわらず、キーボードでキーを押したい:
private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
e.Key.ToString();
}
キーボードで「a」または「A」と入力すると、e.Key の結果は常に「A」になります。「a」と入力して「a」を取得するにはどうすればよいですか?
caplockの有無にかかわらず、キーボードでキーを押したい:
private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
e.Key.ToString();
}
キーボードで「a」または「A」と入力すると、e.Key の結果は常に「A」になります。「a」と入力して「a」を取得するにはどうすればよいですか?
Control.IsKeyLockedメソッドを使用して、KeyDown
イベントCAPS lock
がオンかオフかを確認できます。また、ユーザーが次のような列挙型を使用して識別できるキーを使用して大文字で入力したかどうかを確認する必要がある場合があります-Shift
Modifiers
private void Window_KeyDown(object sender, KeyEventArgs e)
{
string key = e.Key.ToString();
bool isCapsLockOn = System.Windows.Forms.Control
.IsKeyLocked(System.Windows.Forms.Keys.CapsLock);
bool isShiftKeyPressed = (Keyboard.Modifiers & ModifierKeys.Shift)
== ModifierKeys.Shift;
if (!isCapsLockOn && !isShiftKeyPressed)
{
key = key.ToLower();
}
}
KeyDown
イベントはご利用いただけません。TextInput
イベントを使用する必要があります。これにより、元の文字とそのキャプション(大文字/小文字)が印刷されます。
private void Window_TextInput(object sender, TextCompositionEventArgs e)
{
Console.WriteLine(e.Text);
}
これで、Shiftキーを押すと、Shiftキーなども出力されます。これらの修飾子が必要ない場合は、文字列の最後の項目を取得するだけです-char配列として扱います;)-
TextInput / PreviewTextInputのオーバーライド(またはイベントのリッスン)が機能するはずです。
protected override void OnPreviewTextInput(TextCompositionEventArgs e)
{
base.OnPreviewTextInput(e);
Console.WriteLine(e.Text);
}
KeyEventArgs クラスには、SHIFT キーが押されたかどうかを示す「Shift」フィールドがあります。
それ以外の場合、CAPS_LOCK が押されたときに Window_KeyDown メソッドが呼び出されるため、CAPS_LOCK キーが押されたかどうかを示すブール値を保存できます。
bool isCapsLockPressed;
private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) {
if(e.KeyCode == Keys.CapsLock) {
isCapsLockPressed = !isCapsLockPressed;
}
}
これを処理する最良の方法は、KeyDownではなくWindow_TextInputイベントを使用することです。
しかし、あなたが言ったように、このイベントはあなたのアプリケーションで発生しません、あなたはむしろこのようなハックを使うことができます:
bool iscapsLock = false;
bool isShift = false;
private void Window_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.CapsLock)
iscapsLock = !iscapsLock;
if (e.Key >= Key.A && e.Key <= Key.Z)
{
bool shift = isShift;
if (iscapsLock)
shift = !shift;
int s = e.Key.ToString()[0];
if (!shift)
{
s += 32;
}
Debug.Write((char)s);
}
}
これにより、capslockがオンになっているかどうかに基づいて文字が正しく印刷されます。Capslockの初期値は、次のリンクを使用して取得できます。
http://cboard.cprogramming.com/csharp-programming/105103-how-detect-capslock-csharp.html
これがあなたのために働くことを願っています。