Существует ли класс .NET для горячих клавиш, которые можно сопоставить с входящим KeyEventArgs?

В основном у меня есть класс, загруженный во время выполнения, который выглядит так:

[Plugin("Plugin name")]
class PluginActions
{
  [Action("Flip Normals")
  public void FlipNormals()
  {
    // code ....
  }

  [Action("Export .X object")
  public void ExportX()
  {
    // code ....
  }
}

Это в основном добавляет кнопки в форму с настроенными обработчиками событий onClick.

Теперь я хотел бы указать HOTKEYs в том же стиле, используя атрибуты:

[Plugin("Plugin name")]
class PluginActions
{
  [Action("Flip Normals", Hotkey = "Ctrl+N")
  public void FlipNormals()
  {
    // code ....
  }

  [Action("Export .X object", Hotkey = "Ctrl+E")
  public void ExportX()
  {
    // code ....
  }
}

Вопрос в том, как представить и зафиксировать горячие клавиши? Как струны? Возможно, есть класс для этого?

void Form_KeyDown(object sender, KeyEventArgs e)
{
  // reflection magic ...

  foreach(var action in actionAttributes)
  {
    string action_hotkey = action.hotkey;

    /**** How to match KeyEventArgs against action_hotkey? ****/
  }
}

Есть ли вспомогательный класс .net для работы с горячими клавишами?

Или мне нужно развернуть свой собственный класс горячих клавиш?

Какой здесь правильный подход?


person JBeurer    schedule 03.02.2012    source источник


Ответы (2)


В пространстве имен System.Windows.Forms есть перечисление Keys. Тогда для горячей клавиши Ctrl+A вы можете написать что-то вроде этого:

public class Action : Attribute {
  public Keys HotKey {get;set;} 
}


[Action(HotKey = (Keys.Control | Keys.A))]
public void MyMethod() {
  ...
}
person Jakobus    schedule 03.02.2012

KeyEventArgs содержит свойство KeyData, имеющее значение Keys, которое является флагом, означающим, что это может быть так:

Keys keys = Keys.Control | Keys.F; (ваша горячая клавиша)

Если вы определяете свои горячие клавиши (атрибут) таким образом (а не со строкой), вы можете сравнивать клавиши вместо строк.

person Denis Biondic    schedule 03.02.2012