Событие KeyPress не запускается при использовании MouseKeyHook
Я начал использовать библиотеку MouseKeyHook пару дней назад, чтобы перехватывать кнопки клавиатуры для приложения, которое мы создаем (приложение использует цифровую клавиатуру в качестве ввода для отправки определенных сообщений через Akka и т. Д.).
Мне удалось заставить его работать довольно быстро с помощью консольного приложения и регистрации всего там, но как только я переместил реализацию в определенный сервис, он перестал работать (событие не запускается).
Вот пример кода:
public class KeypadService : IKeypad
{
private readonly IKeyboardEvents _keyboardEvents;
public KeypadService()
{
_keyboardEvents = Hook.GlobalEvents();
_keyboardEvents.KeyPress += GlobalHookKeyPress;
}
public void Enable(Action<string> codeEntered)
{
}
public void Disable()
{
_keyboardEvents.KeyPress -= GlobalHookKeyPress;
}
private static void GlobalHookKeyPress(object sender, KeyPressEventArgs e)
{
// Do something
}
}
KeypadService создается Autofac при запуске приложения (а запускаемое приложение является консольным приложением).
builder.RegisterType<KeypadService>().As<IKeypad>().SingleInstance();
Удар по конструктору и все выполняется внутри конструктора.
Любая подсказка относительно того, почему это не могло быть увольнением? Любая помощь приветствуется!
1 ответ
Я предполагаю, что вы пытаетесь подключить клавиатуру из службы Windows. Если так, то есть проблема.
Краткое объяснение: для правильной работы Windows хуки должны иметь так называемый "интерактивный сеанс". Интерактивный сеанс создается всякий раз, когда пользователь входит в систему. Так как на машине с Windows может быть зарегистрировано более одного пользователя, иногда бывает более одного интерактивного сеанса, иногда нет. Службы работают независимо от интерактивных сеансов, они даже работают, когда никто не вошел в систему.
Смотрите эту ветку для подробного объяснения: Глобальная клавиатура Hook от Windows-службы Windows-службы