Как сделать сочетания клавиш в .NET - PullRequest
5 голосов
/ 26 августа 2010

У меня есть приложение Windows в C # /. NET. Мне нужно сделать несколько сочетаний клавиш для навигации между различными формами. Как сделать сочетания клавиш в .NET?

Ответы [ 6 ]

5 голосов
/ 26 августа 2010

Вы можете использовать P / Invoke, чтобы зарегистрировать глобальную горячую клавишу в системе . Если вам не нужно что-то глобальное, вы всегда можете обработать события KeyPress во всех ваших формах.

4 голосов
/ 26 августа 2010

Я полагаю, вы пытаетесь реализовать ярлыки типа Control ?, например, как копировать и вставлять?

Вы можете создать общий обработчик KeyDown и KeyUp, который вы прикрепляете к каждой форме. Каждый раз, когда вы получаете 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>();
}

Вы можете увидеть полное решение, которое цитируется здесь здесь (просто прокрутите вниз, так как именно на этом злом сайте мы не произносим имя.

1 голос
/ 26 августа 2010

Такие вещи обычно выполняются с помощью оконных хуков.Вот статья MSDN, показывающая, как с ними работать:

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

0 голосов
/ 14 января 2013

Шаг № 1 установлен

        KeyPreview = True;

Шаг № 2

        if (e.Alt && e.KeyCode == Keys.C)
        {
            //your function
        }
0 голосов
/ 26 августа 2010

Если ваша родительская форма имеет кнопки или меню, которые пользователь выбирает для открытия подформ, вы можете добавить очень простую горячую клавишу, добавив амперсанд & в атрибут .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 для поддержки сочетания клавиш для активации пункта меню.

0 голосов
/ 26 августа 2010

Вы можете обработать событие Control.KeyPress и проверить комбинацию клавиш для создания сочетаний клавиш: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress.aspx

...