Запускать приложение при обнаружении бездействия пользователя C #

Я создал приложение для Windows на C #, которое открывает форму выигрыша, вводимую пользователем, под названием mywinform.exe. Я хочу выполнить этот mywinform.exe, если пользователь не будет активен в течение периода времени t (без перемещения / ввода с помощью мыши или ввода с клавиатуры). Я пробовал использовать планировщик задач Windows, но он так глючит и совсем ненадежен, особенно когда дело доходит до создания задач с триггерами Idle. Итак, теперь мне интересно, как я могу сделать это на C #, где я хочу иметь приложение или службу для обнаружения неактивности пользователя и запуска mywinform.exe по достижении времени t.

Я проверил и обнаружил, что GetLastInputInfo может сделайте это, как показано в этом сообщении, но я не хочу, чтобы отображалось приложение для обнаружения бездействия пользователя, так что есть ли способ заставить его работать в фоновом режиме или в качестве службы?


person Tak    schedule 16.07.2020    source источник
comment
Ищите как создать сервис в .net. Множество руководств.   -  person Tarik    schedule 16.07.2020
comment
@Tarik Так ты думаешь, что для достижения моей цели нужно создать сервис?   -  person Tak    schedule 16.07.2020
comment
Альтернативный вариант - закрыть приложение или запустить mywinform.exe.   -  person Tarik    schedule 16.07.2020
comment
Вам не нужен интерфейс. Найдите ApplicationContext и передайте свой экземпляр Application.Run() в program.cs.   -  person Idle_Mind    schedule 17.07.2020
comment
@Idle_Mind Спасибо за ваш комментарий. Я погуглил ApplicationContext, но я потерялся. Не могли бы вы более подробно объяснить, что вы имели в виду в своем предыдущем комментарии? Спасибо.   -  person Tak    schedule 17.07.2020
comment
Вы можете создать класс, который наследуется от ApplicationContext, затем создать его экземпляр и передать его в Run () вместо формы. Это позволяет вам иметь приложение, которое не отображает окно консоли, а также не отображает никаких форм. Ваш код будет внутри этого класса и начнется с конструктора. Вы бы реализовали там код GetLastInputInfo.   -  person Idle_Mind    schedule 17.07.2020
comment
Чтобы объяснить почему использовать что делать от Idle_Mind: ожидается, что основной поток приложения Windows останется в цикле сообщений. Application.Run() обеспечивает такой цикл сообщений. Цикл должен заканчиваться в нужный момент. Если вы передадите экземпляр Form в Application.Run, цикл завершится, когда форма (ваше главное окно) закроется. Используя ApplicationContext, вы можете получить другое событие (например, нажатие горячей клавиши) для выхода из цикла обработки сообщений. Имея цикл сообщений, ваш код без главного окна будет работать правильно с OLE и другими библиотеками, которым нужны скрытые окна только для сообщений.   -  person Ben Voigt    schedule 17.07.2020
comment
@BenVoigt Большое спасибо. Можно ли дать ответ с помощью демонстрации, раз уж я заблудился, пожалуйста?   -  person Tak    schedule 17.07.2020