C#: Как подписаться на событие в статическим классе?
В приложении используется пакет NHotkey.Wpf для назначения глобальных горячих клавиш.
Имеется статический класс с методом public static void Enable(), который добавляет заранее прописанные горячие клавиши.
Проблема: если такая клавиша уже будет зарегистрирована пользователем, то метод выдаст ошибку, NHotkey.Wpf.HotkeyAlreadyRegistered.
В обычном, нестатическом, классе я просто подписался на событие и перенаправляю его в виде текста об ошибке в консоль.
NHotkey.Wpf.HotkeyManager.HotkeyAlreadyRegistered += (sender, e) => { Console.WriteLine("This Hotkey already registered!"); };
Где на это событие подписаться в статическом классе - я не понимаю, т.к. нет конструктора класса. Если добавить эту строку в начало метода Enable(), это тоже ничего не даст.
Я также пробовал подписаться на событие прямо в конструкторе public App в файле App.xaml.cs, но и это не помогло.
Не уверен, что будет правильным исключать каждую отдельную горячую клавишу через try-except.
Код:
static class Test
{
public static void Enable()
{
NHotkey.Wpf.HotkeyManager.HotkeyAlreadyRegistered += HotkeyManager_HotkeyAlreadyRegistered;
NHotkey.Wpf.HotkeyManager.Current.AddOrReplace("hotkey1", Key.Q, ModifierKeys.Control, (sender, e) => { Console.WriteLine("hotkey1"); });
NHotkey.Wpf.HotkeyManager.Current.AddOrReplace("hotkey2", Key.W, ModifierKeys.Control, (sender, e) => { Console.WriteLine("hotkey2"); });
NHotkey.Wpf.HotkeyManager.Current.AddOrReplace("hotkey3", Key.E, ModifierKeys.Control, (sender, e) => { Console.WriteLine("hotkey3"); });
. . .
// таких клавиш около 10 и прописывать try-catch для каждой кажется мне неуместным
}
private static void HotkeyManager_HotkeyAlreadyRegistered(object sender, NHotkey.Wpf.HotkeyAlreadyRegisteredEventArgs e)
{
Console.WriteLine("Клавиша уже зарегистрирована");
}
}
Ответы (1 шт):
Через обработчик не получится, судя по тому, что я вижу в исходниках, обработчик события HotkeyAlreadyRegistered работает только с методом AddKeyBinding.
Поле Name нормально передается в исключение HotkeyAlreadyRegisteredException.
Чтобы не повторять код с исключениями, можно сделать коллекцию и цикл.
Key[] keys = new Key[] { Key.Q, Key.W, Key.E };
foreach (Key key in keys)
{
try
{
NHotkey.Wpf.HotkeyManager.Current.AddOrReplace($"Ctrl+{key}", key, ModifierKeys.Control, (sender, e) => { Console.WriteLine(e.Name); });
}
catch (HotkeyAlreadyRegisteredException ex)
{
Console.WriteLine($"Hotkey '{ex.Name}' is already registered!");
}
}
Hotkey 'Ctrl+Q' is already registered!