社区首页 >问答首页 >如何在.NET中创建键盘快捷键

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

Stack Overflow用户
提问于 2010-08-26 15:42:04
回答 5查看 9.7K关注 0票数 5

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-08-26 15:51:17

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

票数 5
EN

Stack Overflow用户

发布于 2010-08-26 15:51:04

我假设您正在尝试实现Control ?类型的快捷方式,就像复制和粘贴一样?

您可以创建附加到每个表单的通用KeyDownKeyUp处理程序。每次你得到一个KeyDown,把键存储在一个列表中(为了说明按住一个键再按下另一个键)。每次向列表中添加键时,请检查列表中是否包含任何快捷键组合。如果是这样的话,执行您需要的任何代码。

对于每个KeyUp事件,请确保您正在从列表中删除(您只需检查添加KeyDown时的快捷方式。

编辑:进行了快速搜索,发现实现了相同的解决方案:

代码语言:javascript
代码运行次数:0
复制
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的完整解决方案(只需滚动到底部,因为它在那个邪恶的网站上,我们没有提到它的名字。

票数 4
EN

Stack Overflow用户

发布于 2010-08-26 15:52:13

这类事情通常是使用windows挂钩来完成的。这是一篇MSDN文章,展示了如何使用它们:

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3576787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文