如何在Windows窗体应用程序中创建复合键盘快捷方式?

时间:2008-10-10 16:05:18

标签: .net winforms keyboard-shortcuts

我想创建一个组件,允许我们使用与任意命令关联的复合键盘快捷键,例如Visual Studio IDE和Microsoft Office。

即,键盘快捷键由一系列多次击键组成,例如 Ctrl + W + C 。在Visual Studio中,这将打开类视图。当按下第一组键时( Ctrl + W ),按下“(Ctrl + W)消息。等待和弦的第二个键... “出现在状态栏中。

5 个答案:

答案 0 :(得分:12)

特别是在回答键盘和弦的问题时,我认为此时没有现成的选项。

但是,建模应该很简单。我会创建一个单独的类,也许是KeyboardChordProvider。它需要知道表单级别的键盘事件。如其他地方所述,Form.KeyPreview属性必须为true。此提供程序订阅Form.KeyPress事件可能已足够。如果你传入表单,你可以在提供者的构造函数中完成所有这些。

您需要向提供商注册潜在的击键。

此实例内部将跟踪当前状态。每当观察到表示和弦的第一个键的击键时,您将更新提供者的状态并引发事件,以便订阅者可以设置文本:(CTRL + W)被按下。等待和弦的第二把钥匙......

如果下一次击键与潜在的辅助选项匹配,那么您有一个匹配并且可以引发包含所输入笔画细节的ChordPressed事件。或者,您可能只是调用在和弦注册时提供给提供者的特定回调(以避免在ChordPressed事件处理程序中使用switch语句或其他一些调度)。

如果在任何时候,击键与潜在的 next 选项不匹配,那么您将重置提供者的状态。

在提供程序内部,您可以使用树结构对可能的击键进行建模。提供者的当前状态只是一个特定的树节点。开始时,根节点将处于活动状态。如果孩子匹配击键,那么它将成为预期下一个笔划的当前节点。如果孩子是一个叶子节点,那么整个和弦已匹配,你会引发ChordPressed事件(传递让你到达那一点的笔画链)或调用存储在叶子中的回调。只要没有击键与子项匹配,请重置为使根节点处于活动状态。

我认为这种设计可以达到你想要的效果。

答案 1 :(得分:2)

菜单控件具有名为ShortCut的属性,您可以在其中指定值。按下该快捷键时,将调用该菜单项。将该属性用于具有相应菜单的命令。

如果您需要菜单上无法使用的快捷方式,那么您必须通过表单或控件上的KeyUpKeyDown事件来处理您的自我。 KeyEventArgs对象将传递给您的处理程序,您可以检查按下了哪个键,以及是否还按下了Ctrl,Alt或Shift键。

MSDN的示例代码:

// Handle the KeyDown event to determine the type of character entered into the control.
private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    // Initialize the flag to false.
    nonNumberEntered = false;

    // Determine whether the keystroke is a number from the top of the keyboard.
    if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9)
    {
        // Determine whether the keystroke is a number from the keypad.
        if (e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9)
        {
            // Determine whether the keystroke is a backspace.
            if(e.KeyCode != Keys.Back)
            {
                // A non-numerical keystroke was pressed.
                // Set the flag to true and evaluate in KeyPress event.
                nonNumberEntered = true;
            }
        }
    }
    //If shift key was pressed, it's not a number.
    if (Control.ModifierKeys == Keys.Shift) {
        nonNumberEntered = true;
    }
}

答案 2 :(得分:0)

使用表单的OnKeyPressed事件并检查eventArgs参数中是否按下了所需的组合键

答案 3 :(得分:0)

除了一些答案之外,在按钮或菜单项的标题中使用&符号会使其加下划线,并且可以使用 Alt +前面的字母进行访问&符号&amp;。

换句话说,如果您的菜单项标题为&amp; File ,则会在F下显示下划线,用户可以通过单击 Alt 来触发菜单+ F

答案 4 :(得分:0)

这取决于键盘快捷键的范围。如果要在不使用工具栏的情况下从窗体上的任何控件使用键盘快捷键,请设置

Form.KeyPreview = true;

在表格上。这将允许所有按键事件通过表单级别的 KeyPress KeyDown KeyUp 事件进行过滤,这将允许单个键盘快捷方式在一个位置处理,而不是在所有用户控件中复制功能。

MSDN: Form.KeyPreview Property