【问题标题】:How to implement catching and showing the current key presses using a WPF TextBox?如何使用 WPF TextBox 实现捕获和显示当前按键?
【发布时间】:2011-09-12 20:20:51
【问题描述】:

喜欢Visual Studio > Options > Keyboard > Press shortcut keys field中的那个。

我可以将此按键保存为单个组合值,还是必须分别保存按键和每个修改键?

我只想在TextBox 中显示当前按下的键,例如:

Ctrl+G
Alt+X
Shift+V
R
Ctrl+Alt+S
etc

也在寻找存储按键值的最佳方式。如果我必须分别存储键和修饰键,那么我将创建一种新类型,将它们全部放在一个位置。

【问题讨论】:

    标签: c# .net wpf keyboard keyboard-shortcuts


    【解决方案1】:

    在文本框KeyDown事件中:

            string keys = "";
    
            if ((Keyboard.Modifiers & ModifierKeys.Control) > 0)
            {
                keys += "Control + ";
            }
    
            if ((Keyboard.Modifiers & ModifierKeys.Alt) > 0)
            {
                keys += "Alt + ";
            }
    
            if ((Keyboard.Modifiers & ModifierKeys.Shift) > 0)
            {
                keys += "Shift + ";
            }
    
            keys += e.Key;
    
            YourTextBox.Text = keys;
    

    【讨论】:

    • 谢谢它的工作,但如果我按“Alt + anyKey”,它会打印“Alt + System”,而不是说“Alt + F”。如何纠正这种行为?
    • 看看here你会找到答案的。
    【解决方案2】:

    我不知道有比 Navid 显示的更快的方法(分别检查每个修饰符)。

    此外,还没有结合 Key 和 Keyboard.Modifiers 的内置类型,因此您必须像这样创建自己的:

    public class KeyboardStatus
    {
        public KeyboardStatus(Key key, ModifierKeys modifiers)
        {
            _modifiers = modifiers;
        }
    
        public Key PressedKey { get; set; }
        public bool IsControlPressed { get { return ((_modifiers & ModifierKeys.Control) > 0); } }
        // ....
    
        public override string ToString()
        {
            string display = string.Empty;
    
            display += ((Keyboard.Modifiers & ModifierKeys.Control) > 0) ? "Ctrl + " : string.Empty;
            display += ((Keyboard.Modifiers & ModifierKeys.Alt) > 0) ? "Alt + " : string.Empty;
            display += ((Keyboard.Modifiers & ModifierKeys.Shift) > 0) ? "Shift + " : string.Empty;
            display += ((Keyboard.Modifiers & ModifierKeys.Windows) > 0) ? "Win + " : string.Empty;
            display += PressedKey.ToString();
            return display;
        }
        ModifierKeys _modifiers;
    }
    

    【讨论】:

    • 谢谢它的工作,但如果我按“Alt + anyKey”,它会打印“Alt + System”,而不是说“Alt + F”。如何纠正这种行为?
    • 难道这行 display += Key.ToString() 实际上是使用 Key 作为类型而不是 Key 本地属性?尝试将属性重命名为 PressedKey(或其他一些非保留名称)。我将更改示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多