我希望键盘上的按键是否带有锁扣:
private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
e.Key.ToString();
}
当我在键盘上键入“a”或“A”时,e.Key的结果始终为“A”。如何输入'a'进入'a'?
答案 0 :(得分:6)
您无法使用KeyDown
事件。您需要使用TextInput
事件。这将打印原始字母及其标题(大写/小写)。
private void Window_TextInput(object sender, TextCompositionEventArgs e)
{
Console.WriteLine(e.Text);
}
现在,如果按下它,也会打印Shift等等。如果您不希望这些修饰符只是获取字符串的最后一项 - 将其作为char数组;) -
答案 1 :(得分:6)
您可以使用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();
}
}
答案 2 :(得分:4)
重写TextInput / PreviewTextInput(或监听事件)应该有效。
protected override void OnPreviewTextInput(TextCompositionEventArgs e)
{
base.OnPreviewTextInput(e);
Console.WriteLine(e.Text);
}
答案 3 :(得分:2)
KeyEventArgs class有“Shift”字段,表示是否按下了SHIFT键。
否则,因为按下CAPS_LOCK时会调用Window_KeyDown方法,可以保存一个 bool值,表示是否按下了CAPS_LOCK键。
bool isCapsLockPressed;
private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) {
if(e.KeyCode == Keys.CapsLock) {
isCapsLockPressed = !isCapsLockPressed;
}
}
答案 4 :(得分:0)
处理此问题的最佳方法是使用Window_TextInput事件而不是KeyDown。
但是正如你所说的那样,这个事件不会对你的应用程序产生影响,你可以使用这样的hack:
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的初始值:
http://cboard.cprogramming.com/csharp-programming/105103-how-detect-capslock-csharp.html
我希望这适合你。