我该如何处理自定义热键设置?(How can I handle a customizable hot

2019-09-28 12:41发布

我试图让我的应用程序的用户一个选项来设置键盘热键为一些功能。

现在,我使用的是TextBoxKeyDown事件,如下所示:

Key Hotkey;
private void SetHotKey(object sender, KeyEventArgs e)
{
    (sender as TextBox).Text = e.Key.ToString();
    Hotkey = e.Key;
    e.Handled = true;
}

这种方法的问题是我不能设置复杂的快捷键,如[按Ctrl] + [F4]。 有一些第三方的控制与帮助? 或更适合事件订阅在一个文本框?

更新:我已经改变了我的代码,但似乎我还是做错了什么。

Key Hotkey;
bool lControl = false;
bool lAlt = false;
bool lShift = false;
private void SetHotKey(object sender, KeyEventArgs e)
{
    var k = e.Key;
    if (e.IsDown)
    {
        var tb = sender as TextBox;
        tb.Text = "";
        lControl = Keyboard.IsKeyDown(Key.LeftCtrl);
        lAlt = Keyboard.IsKeyDown(Key.LeftAlt);
        lShift = Keyboard.IsKeyDown(Key.LeftShift);
        if (lControl) tb.Text += "Ctrl+";
        if (lAlt) tb.Text += "Alt+";
        if (lShift) tb.Text += "Shift+";
        tb.Text = e.Key.ToString();
        Hotkey = e.Key;
    }
    e.Handled = true;
}

我怎样才能使它发挥作用,并期待更清洁呢?

Answer 1:

让你在正确的方向开始。

首先,你需要背后的系统/ ImeProcessed / DeadCharProcessed关键,真正的关键。 这可以用更容易获得扩展方法来完成。

public static Key RealKey(this KeyEventArgs e)
{
    switch (e.Key)
    {
        case Key.System:
            return e.SystemKey;

        case Key.ImeProcessed:
            return e.ImeProcessedKey;

        case Key.DeadCharProcessed:
            return e.DeadCharProcessedKey;

        default:
            return e.Key;
    }
}

然后你应该格式化您的修改器快捷方式,不只是被按下的键。 您可以使用Keyboard.ModifierKeys获得标志和进行简单格式化,收集那些在列表中。 而且还应该从更新热键只是阻止修改键(Ctrl,Alt和Shift键)。

private void SetHotKey(object sender, KeyEventArgs e)
{
    var nonShortcuttableKeys = new[] { Key.LeftAlt, Key.RightAlt, Key.LeftCtrl, Key.RightCtrl, Key.LeftShift, Key.RightShift };
    var actualKey = e.RealKey();

    if (e.IsDown && !nonShortcuttableKeys.Contains(actualKey))
    {
        var tb = sender as TextBox;

        var modifiers = new List<ModifierKeys>();
        if (Keyboard.Modifiers.HasFlag(ModifierKeys.Control))
        {
            modifiers.Add(ModifierKeys.Control);
        }

        if (Keyboard.Modifiers.HasFlag(ModifierKeys.Alt))
        {
            modifiers.Add(ModifierKeys.Alt);
        }

        if (Keyboard.Modifiers.HasFlag(ModifierKeys.Shift))
        {
            modifiers.Add(ModifierKeys.Shift);
        }

        tb.Text = modifiers.Count == 0
            ? string.Format("{0}", actualKey)
            : string.Format("{0} + {1}", string.Join(" + ", modifiers), actualKey);

        Hotkey = actualKey;
    }

    e.Handled = true;
}


Answer 2:

的WinForms您可以检查KeyEventArgs.Modifiers如果Ctrl被按下。 https://msdn.microsoft.com/en-us/library/system.windows.forms.keyeventargs.modifiers(v=vs.110).aspx

WPF

你可以使用这个小片段,以检查是否已按下Ctrl键:

Keyboard.IsKeyDown(Key.LeftCtrl)

如果你想使用MVVM模式,你可以使用文本框的键绑定(或任何其他控件) 创建关键在WPF结合



文章来源: How can I handle a customizable hotkey setting?