![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
поймать сообщение в сервисе [D6, NT4, Win2k, WinXP]
tim © (2003-11-25 13:43:00)
Есть сервис, который регистрирует сообщение в Windows с помощью RegisterWindowMessage.
Есть программа, которая изменяет некоторые данные и должна сообщить об этом сервису, соответственно она тоже регистрирует сообщение с таким же именем и посылает: SendMessage(HWND_BROADCAST,newmes,0,0);. А вот поймать в сервисе у меня не получается. Пробовал так:
procedure TsrvBackUper.DefaultHandler(var Message);
begin
if TMessage(Message).Msg =newmes then writetolog("поймал") else begin
inherited DefaultHandler(Message);
end;
end;
Если кто встречался с подобной проблемой, подскажите пожалуйста.
Digitman (2003-11-25 16:43:00) [1]
> ответить
ответить на ЧТО ? ответ на все твои вопросы тянут на приличную по времени лекцию ... я не имею такого времени
tim (2003-11-25 15:53:00) [2]
спасибо, хотя можно было и ответить(
Digitman (2003-11-25 15:43:00) [3]
> что за функция ControlService?
F1 не пришло в голову нажать ? прежде чем спрашивать ?
> как перекрыть TService.DoCustomControl()
точно так же как любой вирт.метод любого класса .. т.е. со спецификатором override
> DoCustomControl - это обработка сообщения CM_SERVICE_CONTROL_CODE=
> WM_USER + 1 с параметром, не равным предопределенным, точнее
> больше 5. Это сообщение не регистрируется, а константа в
> модуле.
совершенно верно.
и что тебя в этом смущает ?
tim (2003-11-25 15:36:00) [4]
да, мне надо всего один параметр.
что за функция ControlService?
как перекрыть TService.DoCustomControl()
только что прбовал - не получилось, хотя не утверждаю как правильно его перекрыть.
как послать сообщение из внешней проги и какое сообщение?
посмотрел в исходниках.DoCustomControl - это обработка сообщения CM_SERVICE_CONTROL_CODE=
WM_USER + 1 с параметром, не равным предопределенным, точнее больше 5. Это сообщение не регистрируется, а константа в модуле.
Digitman (2003-11-25 15:26:00) [5]
подробнее ЧТО ?
tim (2003-11-25 14:59:00) [6]
а поподробнее пожалуйста?
Digitman (2003-11-25 14:25:00) [7]
кр.того, сервис должен создать и иметь свое top-level-окно, чтобы получать в принипетакие сообщения
и ,кр.того, если сервису требуется передавать всего один параметр размером в DWORD, нет нужды выкрутасничать с окнами и пр. ... это легко реализуемо с пом. ф-ции ControlService() и перекрытия protected-метода TService.DoCustomControl() в твоем классе-наследнике TsrvBackUper
Digitman (2003-11-25 14:18:00) [8]
сервис должен иметь св-во "Allow service to interract with desktop"
установи этот атрибут и попробуй повторить