Я увлекаюсь услугами Windows.
Из того, что я прочитал, и из учебных пособий, которые я рассмотрел ( один пример ), я вижу, что вся работа должна выполняться в методе OnStart
службы.
Насколько я понимаю (из единственных учебных пособий, которые я смог найти, которые были полностью базовыми) после возврата метода OnStart
служба не может ничего сделать, если вы каким-то образом не настроили ее в методе.
Я видел использование таймеров в указанном методе для запуска событий каждые X секунд, но я ищу для обнаружения изменений фокуса окна (когда программа пытается вывести свое окно вперед). Решение в этом ответе отлично работает, когда я пробую его в консольном приложении, но я хочу использовать его в своем сервисе.
Однако простая регистрация обработчика событий в методе OnStart
не работает - он не срабатывает и не имеет никакого эффекта. Я попытался установить таймер, чтобы сохранить метод OnStart
, но это тоже не помогло - таймер работал и работал каждый тик, но обработчик событий никогда не срабатывал (я ставил File.AppendText
для каждого тика таймера и каждый раз, когда обработчик срабатывает, но в текстовом файле, который я использовал в качестве элемента управления, добавлялись только отметки таймера).
Наконец, я попытался запустить Task
(используя Task.Run
для создания нового потока), который запустил бесконечный цикл в отдельном методе от OnStart
, но это просто привело к зависанию запуска службы при ее продолжении и вкл.
Код:
protected override void OnStart(string[] args)
{
File.WriteAllText("file.txt", "START");
eventLog.WriteEntry("Entered OnStart method.");
// Update the service state to "Start Pending".
ServiceStatus serviceStatus = new ServiceStatus
{
dwCurrentState = ServiceState.SERVICE_START_PENDING,
dwWaitHint = 100000
};
SetServiceStatus(this.ServiceHandle, ref serviceStatus);
eventLog.WriteEntry("Start Pending.", EventLogEntryType.Information);
// Update the service state to "Running".
serviceStatus.dwCurrentState = ServiceState.SERVICE_RUNNING;
SetServiceStatus(this.ServiceHandle, ref serviceStatus);
eventLog.WriteEntry("Running.", EventLogEntryType.Information);
Task.Run(KeepBusy());
}
private static Action KeepBusy()
{
Automation.AddAutomationFocusChangedEventHandler(OnFocusChangedHandler);
while (true)
{
Thread.Sleep(1000);
}
}
Короче говоря - если я правильно понимаю, что сервисы могут выполнять работу только методом OnStart
, я чувствую отвращение к тому, насколько это глупо, и не могу понять, как сделать сервис "слушателя"