7

我想在有或没有大写锁定的情况下按下键盘上的键:

private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
   e.Key.ToString();
}

当我在键盘上键入“a”或“A”时,e.Key 的结果总是“A”。输入“a”如何获得“a”?

4

5 回答 5

6

您可以使用Control.IsKeyLocked方法检查您的KeyDown事件CAPS lock是打开还是关闭。此外,您可能需要检查用户是否使用可以像这样使用枚举识别的键输入大写 -ShiftModifiers

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();
   }
}
于 2012-10-14T07:46:40.200 回答
6

您不能使用该KeyDown事件。您将需要使用该TextInput事件。这将打印带有标题(大写/小写)的原始字母。

    private void Window_TextInput(object sender, TextCompositionEventArgs e)
    {
        Console.WriteLine(e.Text);
    }

现在,如果按下它,它也会打印 Shift 等。如果您不想要这些修饰符,只需获取字符串的最后一项 - 将其视为 char 数组;)-

于 2012-09-25T22:22:40.813 回答
5

覆盖 TextInput/PreviewTextInput(或监听事件)应该可以工作。

protected override void OnPreviewTextInput(TextCompositionEventArgs e)
{
    base.OnPreviewTextInput(e);
    Console.WriteLine(e.Text);
}
于 2012-10-07T23:53:42.017 回答
2

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;
           }
    }
于 2012-10-09T04:26:42.157 回答
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

我希望这对你有用。

于 2012-10-13T21:32:44.477 回答