如何在.NET中制作键盘快捷键

时间:2010-08-26 15:42:04

标签: c# .net keyboard-shortcuts

我在C#/ .NET中有一个Windows应用程序。我需要制作一些键盘快捷键来在不同的表单之间导航。如何在.NET中创建键盘快捷键?

6 个答案:

答案 0 :(得分:5)

您可以使用P / Invoke register a global hotkey on the system。如果您不想要全局的东西,您可以随时处理所有表单中的KeyPress事件。

答案 1 :(得分:4)

我假设您尝试实施Control ?类型的快捷方式,例如复制和粘贴工作方式?

您可以创建附加到每个表单的通用KeyDownKeyUp处理程序。每当你得到一个KeyDown将密钥存储在一个列表中(以便按住一个密钥并点击另一个密钥)。每次向列表添加密钥时,请检查列表是否包含任何快捷键组合。如果是,请执行您需要的任何代码。

对于每个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>();
}

你可以看到here引用的完整解决方案(只是滚动到底部,因为它位于那个我们不会说出名字的邪恶网站上。

答案 2 :(得分:1)

这些事情通常都是使用Windows钩子完成的。这是一篇MSDN文章,展示了如何使用它们:

http://msdn.microsoft.com/en-us/magazine/cc188966.aspx

答案 3 :(得分:0)

您可以处理Control.KeyPress事件并检查组合键以制作键盘快捷键:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress.aspx

答案 4 :(得分: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将自动将所需代码添加到Designer文件中,以支持键盘快捷方式以激活菜单项。 / p>

答案 5 :(得分:0)

第1步

        KeyPreview = True;

第2步

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