| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > Перехват сообщений в сервисе |
| Автор: Mosian 17.7.2009, 12:17 |
| Сервис написан без форм на APi Необходимо получить системное сообщение об изменении конфигурации Windows (wm_devicechange) В главном потоке сервиса подписываюсь на получение сообщений Registerdevicenotification (handlService, @структура на то что хочу получать, Flag); Где flag = device_notify_window_handle если 1 параметр Окно device_notify_service_handle если 1 параметр сервис (мой случай). Проблема первая (device_notify_service_handle) – пишет Undeclared , а (device_notify_window_handle) проходит объявление в Windows ГДЕ ВЗЯТЬ device_notify_service_handle? Проблема вторая, чем перехватывать эти сообщения? (Может создать поток и вызывать в нём GetMessage) Сильно не судите чайник. |
| Автор: Virtuals 17.7.2009, 13:01 |
| Mosian, 2. wm_devicechange сообщение оконное, соответственно и ловят его окна |
| Автор: Mosian 17.7.2009, 14:14 |
| Через AllocateHWND пробовал молчит окошко; Возможно я неправильно передаю в RegisterServiceCtrlHandle Handle сервиса беру его из registerServiceCtrlHandler либо необходимо OpenService? И где правильно вызывать RegisterServiceCtrlHandle в основном потоке либо без разницы |
| Автор: Mosian 17.7.2009, 15:42 |
| Kami а где взять RegisterServiceCtrlHandlerEx |
| Автор: kami 17.7.2009, 17:20 | ||||||||
и при этом указывал DEVICE_NOTIFY_WINDOW_HANDLE ?
Добавлено через 12 минут и 13 секунд
Читаем еще раз:
Смотрим, что возвращает RegisterServiceCtrlHandler: SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerEx( __in LPCTSTR lpServiceName, __in LPHANDLER_FUNCTION_EX lpHandlerProc, __in_opt LPVOID lpContext ); то есть, параметр передан правильно. Теперь смотрим на http://msdn.microsoft.com/en-us/library/ms683241(VS.85).aspx
Вывод - если нужно получать не через оконную функцию, а через callback функцию сервиса, то Hander (который регистрируется через RegisterServiceCtrlHandler) ничего не получит, как бы ни старался, тогда только HandlerEx. |
| Автор: Mosian 20.7.2009, 14:32 | ||||
| Люди что я делаю не так HendlerEx не получает сообщения SERVICE_CONTROL_DEVICEEVENT да и другие доп. параметры введённые для данной функции. Сервис должен реагировать на вкл. выкл. USB Ниже я привёл код, где происходит рег. Функции обработчика сообщ.
|
| Автор: kami 20.7.2009, 18:03 | ||||||
Неверное объявление. Должно быть:
А в этом коде не видно, что обрабатываются коды SERVICE_CONTROL_DEVICEEVENT Хочу еще обратить внимание на DEV_BROADCAST_DEVICEINTERFACE:
Это во-первых. А во-вторых, нужно учитывать, что dbcc_name:array[0..0] of char; (для сервиса - WideChar) - это сишная структура, которая не мешает обращаться по другим индексам этого массива. В Delphi с этим могут возникнуть проблемы. (меня самого как-то "ткнули носом" в это на другом форуме). |
| Автор: Mosian 21.7.2009, 16:04 | ||
| В ServiceCtrlHandler приходят только стандартные сообщенки сервиса (stop start) Но SERVICE_CONTROL_DEVICEEVENT так и не работает Что может быть
|