Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在.NET中创建键盘快捷键_C#_.net_Keyboard Shortcuts - Fatal编程技术网

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

C# 如何在.NET中创建键盘快捷键,c#,.net,keyboard-shortcuts,C#,.net,Keyboard Shortcuts,我有一个C#/.NET中的Windows应用程序。我需要制作一些键盘快捷键来在不同的窗体之间导航。如何在.NET中创建键盘快捷键?您可以处理Control.KeyPress事件并检查组合键以创建键盘快捷键:我假设您试图实现控件?键入快捷键,就像复制和粘贴一样 您可以创建附加到每个表单的通用KeyDown和keydup处理程序。每次你得到一个KeyDown键时,将该键存储在一个列表中(以说明按住一个键并敲击另一个键的原因)。每次向列表中添加键时,请检查列表中是否包含任何快捷键组合。如果是这样,执行

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

您可以处理Control.KeyPress事件并检查组合键以创建键盘快捷键:

我假设您试图实现
控件?
键入快捷键,就像复制和粘贴一样

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

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

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

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>();
}
class键盘快捷键
{
public static void Window_KeyDown(对象发送器,System.Windows.Input.KeyEventArgs e)
{
if(m_keysDownList.Contains(e.Key)=false)
{
m_keys downlist.Add(e.Key);
Debug.WriteLine(e.Key.ToString()+“Down”);
}
CheckForKeyCombos();
}
公共静态无效窗口\u KeyUp(对象发送方,System.Windows.Input.KeyEventArgs e)
{
m_keys downlist.Remove(e.Key);
Debug.WriteLine(e.Key.ToString()+“Up”);
}
公共静态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))
{
//处理前清除列表(对话框
//可能会妨碍监听按键事件,离开
//列表中的键-请先清除)。
ClearKeysDownList();
//句柄Ctrl+A+C组合键
Handelectrocombo();
}
}
}
}
私有静态void ClearKeysDownList()
{               
m_keysDownList.Clear();
}
公共静态无效HandElectrocombo()
{
如果(HandElectrocomboDelegate!=null)
{
handlectrocombodelegate();
}
}
//每个组合都需要一个委托实例
公共委托void handlelecombodelegate();
公共静态handlectrocombodelegate handlectrocombodelegate;
私有静态列表m_keysDownList=新列表();
}

您可以看到引用的完整解决方案(只需滚动到底部,因为它位于我们不知道名称的邪恶网站上。

您可以使用p/Invoke。如果您不想要全局性的东西,您可以始终以所有形式处理按键事件。

这些事情通常使用windows挂钩来完成。下面是一篇MSDN文章,介绍如何使用它们:


如果父窗体具有用户选择打开子窗体的按钮或菜单,则可以通过在.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将自动向设计器文件添加所需的代码,以支持激活菜单项的键盘快捷键。

步骤1设置

        KeyPreview = True;
第2步

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

请扩大你的答案。