如何在.NET中创建键盘快捷键

5

我有一个使用C#/.NET开发的Windows应用程序。我需要创建一些键盘快捷键以在不同的窗体间导航。在.NET中如何创建键盘快捷键?

6个回答

5
您可以使用 P/Invoke 在系统上注册全局热键。如果您不需要全局热键,您可以在所有窗体中处理 KeyPress 事件。请参考此链接了解更多信息。

4
我猜您想实现类似于复制和粘贴的Control ?类型快捷方式吗?
您可以创建一个通用的KeyDownKeyUp处理程序,将它们附加到每个窗体上。每次您按下键时,将按键存储在列表中(以便考虑按住一个键并同时按下另一个键的情况)。每次添加键到列表中时,请检查您的列表是否包含任何快捷键组合。如果是,则执行您需要的任何代码。
对于每个KeyUp事件,请确保从列表中删除按键(您只需要在KeyDown添加时检查快捷方式)。 编辑:我进行了快速搜索,并找到了已实现此解决方案的相同内容。
class KeyboardShortcuts
{
    public static void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
    {
        if (m_keysDownList.Contains(e.Key) == false)
        {
            m_keysDownList.Add(e.Key);
            Debug.WriteLine(e.Key.ToString() + " Down");
        }

        CheckForKeyCombos();
    }

    public static void Window_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
    {
        m_keysDownList.Remove(e.Key);
        Debug.WriteLine(e.Key.ToString() + " Up");
    }


    public static void CheckForKeyCombos()
    {
        if (m_keysDownList.Contains(System.Windows.Input.Key.LeftCtrl))
        {
            if (m_keysDownList.Contains(System.Windows.Input.Key.A))
            {
                if (m_keysDownList.Contains(System.Windows.Input.Key.C))
                {
                    // Clear list before handeling ( Dialogue boxes
                    // can hinder the listening for key up events, leaving
                    // keys in list - so clear first ).
                    ClearKeysDownList();

                    // Handle Ctrl + A + C Combo
                    HandleCtrlACCombo();
                }
            }
        }
    }

    private static void ClearKeysDownList()
    {               
        m_keysDownList.Clear();
    }

    public static void HandleCtrlACCombo()
    {
        if (handleCtrlACComboDelegate != null)
        {
            handleCtrlACComboDelegate();
        }
    }

    // Need a delegate instance for each combo 
    public delegate void HandleCtrlACComboDelegate();
    public static HandleCtrlACComboDelegate handleCtrlACComboDelegate;

    private static List<System.Windows.Input.Key> m_keysDownList = new List<System.Windows.Input.Key>();
}

您可以查看完整的解决方案,引用自这里(只需向下滚动,因为它位于我们不会提及名称的邪恶网站上)。

1

0

如果您的父表单上有按钮或菜单,用户选择打开子表单,您可以通过在 .Text 属性中添加一个和符号 & 来添加一个非常简单的快捷键。

例如,如果您有一个名为 Options 的按钮,您可以按如下方式更改其文本:&Options。这样做将使得从父表单上按下 Alt+O 将会激活该按钮。

或者,如果您想要像 Ctrl+O 这样的热键来打开一个表单,您必须订阅主表单的 KeyDown 事件,并查找该键组合:

    private void FormMain_KeyDown(object sender, KeyEventArgs e)
    {
        if (ModifierKeys == Keys.Control && e.KeyCode == Keys.O))
            // open form
    }

请注意,您可能需要将窗体的KeyPreview属性设置为True。
最后,工具栏菜单项有一个ShortcutKeys属性,您可以在属性面板中定义,VS会自动添加所需的代码到设计文件中,以支持激活菜单项的键盘快捷键。

0

步骤一:设置

        KeyPreview = True;

步骤二

        if (e.Alt && e.KeyCode == Keys.C)
        {
            //your function
        }

请详细阐述您的回答。 - Lee Taylor

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接