![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
System Tray иконки [D6, NT4, Win2k, WinXP]
Pavlik Morozov © (2002-05-26 13:44:00)Hi people!
Проблема вот в чем:
У меня есть WinNT Service Application, которое при запуске регистрирует иконку в систем трее. Только вот беда: когда пользер выходит и заходит снова иконки уже нету! Также она пропадает если Експлорер вываливается и запускается снова!
Как мне определить когда надобно иконку опять регистрировать?
Сенкс!
Pavlik Morozov (2002-06-06 14:42:00) [1]Но после краха он то стартует, а сообщение все-равно не вызывается! :~(
paul_shmakov (2002-05-30 15:43:00) [2]
Но хандлер-то этот вообще никогда не вызывается! Даже когда Эксплорер вываливается!
это сообщение рассылается всем окнам при *старте* explorer.exe, а не при его крахе.
Pavlik Morozov (2002-05-30 09:06:00) [3]Отлаживать-то конечно хорошо! Но хандлер-то этот вообще никогда не вызывается! Даже когда Эксплорер вываливается! Может я чего-то криво написал?
paul_shmakov (2002-05-29 13:07:00) [4]отлаживать надо.
а насчет сомнений по поводу поможет или нет - это единственный нормальный способ определить рестарт эксплорера.
Pavlik Morozov (2002-05-28 13:42:00) [5]ДА вот ни в каком, наверное когда эксплорер вываливаеться окошко, созданное мноу пропадает, но это я так думаю....
Но у меня другой вопрос: действительно ли с помощью этого кода я смогу получить то, что хочу?
paul_shmakov (2002-05-28 01:30:00) [6]хмм.. с виду код вроде бы вполне легальный. а в каком месте возникает "Invalid window handle"?
Pavlik Morozov (2002-05-27 18:18:00) [7]Вот как сделал я:
var
WM_TASKBAR_CREATED: Cardinal = WM_USER;
---------- кусок кода из описания класса -----------
FHandle: THandle;
procedure WndProc(var Message: TMessage);
---------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -----------
procedure TMainSvc.ServiceCreate(Sender: TObject);
begin
WM_TASKBAR_CREATED := RegisterWindowMessage("TaskbarCreated");
FHandle := Classes.AllocateHWnd(WndProc);
end;
procedure TMainSvc.WndProc(var Message: TMessage);
begin
try
with Message do
if (Msg=WM_TASKBAR_CREATED) and Assigned(TrayIcon)
and (WM_TASKBAR_CREATED<>WM_USER) then
begin
TrayIcon.Recreate;
end
else
Result := DefWindowProc(FHandle, Msg, wParam, lParam);
except
end;
end;
procedure TMainSvc.ServiceDestroy(Sender: TObject);
begin
Classes.DeallocateHWnd(FHandle);
end;
В результате я получаю сообщение "Invalid window handle"
Pavlik Morozov (2002-05-27 17:37:00) [8]А небольшой пример можно ???
paul_shmakov (2002-05-27 01:58:00) [9]нужно обрабатывать сообщение, номер которого возвращает RegisterWindowMessage("TaskbarCreated"). это сообщение посылается эксплорером во время его запуска.
Song (2002-05-26 14:02:00) [10]Засовывать когда её там не будет. Определить можно через FindWindow()