使用keydown wpf获取小写

时间:2012-09-25 22:07:01

标签: wpf

我希望键盘上的按键是否带有锁扣:

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

当我在键盘上键入“a”或“A”时,e.Key的结果始终为“A”。如何输入'a'进入'a'?

5 个答案:

答案 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

我希望这适合你。