Как сделать так, чтобы windows сервис предотвращал кражу фокуса? - PullRequest
0 голосов
/ 29 августа 2018

Я увлекаюсь услугами 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, я чувствую отвращение к тому, насколько это глупо, и не могу понять, как сделать сервис "слушателя"

...