如何在WPF中从用户读取自定义键盘快捷键?

时间:2010-01-25 23:15:15

标签: wpf keyboard-shortcuts user-input

在我的应用程序中,我想让用户自定义键盘快捷键,就像在Visual Studio的键盘选项中一样。用户可以聚焦空白文本框,然后键入他想要分配给命令的任何快捷方式。

我最接近它的工作是订阅TextBox.PreviewKeyDown事件,将其设置为处理以防止在文本框中输入实际文本。然后我忽略与修饰键相关联的KeyDown事件(是否有更简洁的方法来确定Key是否是修饰键?)。

// Code-behind
private void ShortcutTextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
    // The text box grabs all input
    e.Handled = true;

    if (e.Key == Key.LeftCtrl || 
        e.Key == Key.RightCtrl || 
        e.Key == Key.LeftAlt ||
        e.Key == Key.RightAlt || 
        e.Key == Key.LeftShift ||
        e.Key == Key.RightShift)
        return;

    string shortcutText = "";
    if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
        shortcutText += "Ctrl+";
    if ((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
        shortcutText += "Shift+";
    if ((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt)
        shortcutText += "Alt+";
    _ShortcutTextBox.Text = shortcutText + e.Key.ToString();

}

以上适用于以Ctrl和Ctrl + Shift开头的任何快捷方式,但对于任何Alt快捷方式都失败。当我按下包含Alt的快捷方式时,e.Key始终设置为Key.System

如何记录用户的Alt快捷键?是否有更好,更健壮的方式来记录用户的快捷方式?

2 个答案:

答案 0 :(得分:25)

如果SystemKey属性设置为Key.System,则诀窍是使用Key属性:

private void ShortcutTextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
    // The text box grabs all input.
    e.Handled = true;

    // Fetch the actual shortcut key.
    Key key = (e.Key == Key.System ? e.SystemKey : e.Key);

    // Ignore modifier keys.
    if (key == Key.LeftShift || key == Key.RightShift
        || key == Key.LeftCtrl || key == Key.RightCtrl
        || key == Key.LeftAlt || key == Key.RightAlt
        || key == Key.LWin || key == Key.RWin) {
        return;
    }

    // Build the shortcut key name.
    StringBuilder shortcutText = new StringBuilder();
    if ((Keyboard.Modifiers & ModifierKeys.Control) != 0) {
        shortcutText.Append("Ctrl+");
    }
    if ((Keyboard.Modifiers & ModifierKeys.Shift) != 0) {
        shortcutText.Append("Shift+");
    }
    if ((Keyboard.Modifiers & ModifierKeys.Alt) != 0) {
        shortcutText.Append("Alt+");
    }
    shortcutText.Append(key.ToString());

    // Update the text box.
    _ShortcutTextBox.Text = shortcutText.ToString();
}

我将左右Windows键添加到修饰符列表中,因为当从终端服务器会话中键入复杂(Ctrl+Shift+Alt)组合键时,它们有时会出现在快捷键名称中。但是,它们永远不会出现在Keyboard.Modifiers中,因为它们是为全局快捷方式保留的,所以我不会在那里处理它们。

我还使用StringBuilder来避免创建过多string个实例。

此解决方案适用于除Shift+Alt之外的任何组合键(在这种情况下看不到Alt修饰符)。但这可能是我的终端服务器环境的一个神器,所以你的里程可能会有所不同。

最后,我在窗口中添加了一个_File菜单,看看会发生什么,Alt+F快捷键在到达菜单之前被文本框有效捕获,这似乎是什么你想要的。

答案 1 :(得分:-1)

您好
如果你的应用程序中有You used WPF-Command,你可以使用它:

<Window.InputBindings>
  <KeyBinding Command="YourCommnad"
              Gesture="CTRL+C" />
</Window.InputBindings>