Получение событий в службе


Служба, которая является консольным приложением, может зарегистрировать консольное управление обработчиком (console control handler), чтобы получить уведомление, когда пользователь выходит из системы. Однако, нет никакого события, которое отправляется, когда пользователь работающий в диалоговом режиме начинает работу в системе. Чтобы определить, начал ли работу пользователь работающий в диалоговом режиме, проверьте, что процесс, определенный в следующем ключе запущен:

 

HKEY_LOCAL_MACHINE\SOFTWARE\
     Microsoft\
          Windows NT\
               CurrentVersion\
                    
Winlogon

Этот процесс начинается тогда, когда пользователь, работающий в диалоговом режиме, регистрируется в системе. Поэтому, если этот процесс запущен, то есть пользователь, работающий в диалоговом режиме, начал работу. Чтобы получить список всех запущенных процессов, см. статью Перечисление всех процессов.

Система транслирует всем службам события изменения устройства. Эти события могут быть получены службой в процедуре окна или в ее обрабатывающей программе управления службой. Чтобы определить, какие события должна получить ваша служба, используйте функцию RegisterDeviceNotification.

Убедитесь в том, что обработали события устройства "Plug and Play" как только можно быстро. Иначе, система может стать невосприимчивой. Если ваш обработчик событий должен выполнить операцию, которая может блокировать выполнение (типа операций ввода / вывода), лучше запустить другой поток, чтобы эту операцию выполнить асинхронно.

Когда служба вызывает RegisterDeviceNotification, она также определяет или дескриптор окна или дескриптор состояния службы. Если служба определяет дескриптор окна, процедура окна получает события уведомления. Если служба определяет свой дескриптор состояния, ее сервисная обрабатывающая программа управления получает события уведомления. Дополнительную информацию смотри в описании функции HandlerEx.

Дескрипторы уведомления устройства, возвращенные функцией RegisterDeviceNotification, когда они больше не нужны, должны быть закрыты при помощи вызова функции UnregisterDeviceNotification.

Назад в оглавление
На главную страницу

Hosted by uCoz