簡體   English   中英

如何在.NET中制作鍵盤快捷鍵

[英]How to make keyboard shortcuts in .NET

我在C#/ .NET中有一個Windows應用程序。 我需要制作一些鍵盤快捷鍵來在不同的表單之間導航。 如何在.NET中創建鍵盤快捷鍵?

您可以使用P / Invoke 在系統上注冊全局熱鍵 如果您不想要全局的東西,您可以隨時處理所有表單中的KeyPress事件。

我假設你試圖實現Control ? 類似於復制和粘貼工作方式的快捷方式?

您可以創建附加到每個表單的通用KeyDownKeyUp處理程序。 每次你得到一個KeyDown存儲鍵列表中的鍵( 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>();
}

你可以看到這里引用的完整解決方案(只是滾動到底部,因為它位於那個我們不會說出名字的邪惡網站上。

這些東西通常使用Windows鈎子完成。 這是一篇MSDN文章,展示了如何使用它們:

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

第1步

        KeyPreview = True;

第2步

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

您可以處理Control.KeyPress事件並檢查組合鍵以生成鍵盤快捷鍵: http//msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress.aspx

如果你的父窗體具有用戶選擇打開子表單按鈕或菜單,您可以通過添加符號添加一個非常簡單的熱鍵&對。文本屬性。

例如,如果您有一個按鈕(如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文件以支持鍵盤快捷方式以激活菜單項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM