powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Иконка в трее для службы
25 сообщений из 29, страница 1 из 2
Иконка в трее для службы
    #39744484
tarakan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Задался вопросом как сделать иконку в трее для СЛУЖБЫ. Прошу отказаться от высказываний типа : «Это неблагодарное дело, службы не работают с рабочим столом». Есть код
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
 
begin
  if InstallingMyService then
    begin
      SaveLog('Будет запущено служба');
      Vcl.SvcMgr.Application.initialize;
      FmMainU.IsService := True;
      Vcl.SvcMgr.Application.CreateForm(TFmMain, FmMain);
      //Application.CreateForm(TFmMain, FmMain);
      Vcl.SvcMgr.Application.CreateForm(TService3, Service3);
      Vcl.SvcMgr.Application.run;
      //FmMain.AddIcon;
    end
  else
    begin
      SaveLog('Будет запущено приложение');
      Vcl.Forms.Application.ShowMainForm := True;
      Vcl.Forms.Application.Initialize;
      FmMainU.IsService := false;
      Vcl.Forms.Application.CreateForm(TFmMain, FmMain);
      Vcl.Forms.Application.CreateForm(TService3, Service3);
      Vcl.Forms.Application.Run;
    end;
end.


Общеизвестная проблема в том, что служба запускается от другого пользователя (В случае Windows 7 – это пользователь : «СИСТЕМА») и не знает на каком Desktop рисовать иконку.
Есть функция
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
//  Каллбэк вызываемый в случае запуска сервиса под W2K.
//  Его задача получить токен любого доступного процесса,
//  окна которого найдены в рамках заданного при перечислении десктопа.
// =============================================================================
function EnumDesktopWindowsCallback(
  WndHandle: THandle; Param: LPARAM): BOOL; stdcall;
var
  ProcessID: DWORD;
  ProcessHandle, UserToken: THandle;
begin
  Result := True;
  GetWindowThreadProcessId(WndHandle, ProcessID);
  ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessID);
  if ProcessHandle <> 0 then
  try
    if OpenProcessToken(ProcessHandle, TOKEN_ALL_ACCESS, UserToken) then
    begin
      PDWORD(Param)^ := UserToken;
      Result := False;
    end;
  finally
    CloseHandle(ProcessHandle);
  end;
end;


План такой : По запуску службы запустить функцию поиска активного десктопа и на нем нарисовать иконку.
Не могу в коде это все соединить в одно целое. Нужна помощь знатоков.
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39744508
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tarakanПлан такой : По запуску службы запустить функцию поиска активного десктопа и на нем
нарисовать иконку.

Обломись: нет понятия "активного десктопа", они все одинаковые.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39744510
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ случае Windows 7 – это пользователь : «СИСТЕМА»
запустить можно и могут под любым пользователем, у которого есть права. насколько я знаю, то в win 7 сервисам доступен только скрытый десктоп, то есть до любого пользовательского десктопа доступа нет.
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39744564
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tarakanЗадался вопросом как сделать иконку в трее для СЛУЖБЫ.
Не озвучено, для чего такое надо. Если для того, чтобы управлять службой, то проще сделать отдельное приложение, которое будет общаться со службой.
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39744571
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tarakanПлан такой : По запуску службы запустить функцию поиска активного десктопа и на нем нарисовать иконку.
Рисуй на все десктопы.
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39744578
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне как-то в одном приложении нужно было отследить, когда юзер выходит из системы и снова входит в систему. Ну вот, винда рассылает приложениям соответствующие сообщения. А приложение, в свою очередь, может известить об этом твой сервис. То есть, нужно автостартующее приложение, под каждым юзером.
С другой стороны, если городить такой гемор - пусть уж тогда приложение и рисует в трее...
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39744589
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фэйтл ЭраНу вот, винда рассылает приложениям соответствующие сообщения. А приложение, в свою
очередь, может известить об этом твой сервис.

ЕМНИП, винда и службам рассылает извещения о входе-выходе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39744593
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tarakan,
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39744594
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делали иконки в трее для служб и много раз. Процедура ничем не отличается от десктопного приложения. См. пост выше.

tarakan«Это неблагодарное дело, службы не работают с рабочим столом»
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39744603
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic Hunter,

Это не работает, начиная с Wsndows Vista (или с 7й).
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39744640
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpRelic Hunter,

Это не работает, начиная с Wsndows Vista (или с 7й).Все правильно, начиная с висты служба не может сама взаимодействовать с рабочим столом.

Решение - для размещения иконки в трее, а также для всяких диалоговых окон необходимо использовать дополнительное обычное десктопное приложение. Служба должна обмениваться с этим приложением, протокол обмена - на усмотрение. Можно через tcp/ip, можно через проецируемые файлы и т.д. Я использовал сетевой обмен через Indy, удобно тем, что десктопная программа может запускаться на любом компе, а не только там, где служба.
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39744735
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic Hunter,

делали. до висты.
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39744736
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2,

У нас именно так. мы, правда, до локалхоста, наоборот, ограничивали. В Indy есть полезные компонент для подобных вещей: TIdCmdTCPServer, TIdCmdTCPClient.
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39744781
MaratIsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tarakan,
маяться ерундой, лишь бы не работать
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39744903
tarakan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем, что откликнулись.
Dimitry SibiryakovОбломись: нет понятия "активного десктопа", они все одинаковые.

Ну не надо придираться к словам, смысл все поняли.
goldmi45 Не озвучено, для чего такое надо. Если для того, чтобы управлять службой, то проще сделать отдельное приложение, которое будет общаться со службой.
Да, для управления, просмотра состояния и еще пара моментов.
Такое решение у меня сейчас в приоритете, но…
а) не хотелось бы грузить машину несколькими процессами.
б) Предполагается что залогиненный (активный) пользователь будет работать с ограниченными правами до нельзя, даже скажу больше, компьютер будет работать в автономном режиме без пользователя. А приложение(служба) должна иметь полные права Администратора.

MaratIskмаяться ерундой, лишь бы не работать
Ну если Вы маятесь, то мы нет. А не то, что некоторые суперкодеры нагородят кучу приложений, служб и еще всякой хрени, потом это все глючит. И у таких кодеров только одна задача доказать заказчику, что он дебил и комп у него дохлый, а он суперкодер, который не «мается ерундой»
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39744911
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tarakanкомпьютер будет работать в автономном режиме без пользователя

А на иконку в трее будет любоваться... кто?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39744946
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tarakanПредполагается что залогиненный (активный) пользователь будет работать с ограниченными правами до нельзя, даже скажу больше, компьютер будет работать в автономном режиме без пользователя. А приложение(служба) должна иметь полные права Администратора.так это не проблема. У службы настраиваете свои права, у приложения свои - это же разные exe-шники.
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39744947
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tarakanИ у таких кодеров только одна задача доказать заказчику, что он дебил и комп у него дохлый, а он суперкодер, который не «мается ерундой»
Заказчик, наверное, много платит, если ты который день ерундой страдаешь. Можно на эти деньги было комп проапгрейдить, но он же "дебил"...
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39744948
tarakan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
asutp2так это не проблема. У службы настраиваете свои права, у приложения свои - это же разные exe-шники.
Вопрос и сводиться к тому, чтобы один exe запускался с разными правами.
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39744951
tarakan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Фэйтл ЭраtarakanИ у таких кодеров только одна задача доказать заказчику, что он дебил и комп у него дохлый, а он суперкодер, который не «мается ерундой»
Заказчик, наверное, много платит, если ты который день ерундой страдаешь. Можно на эти деньги было комп проапгрейдить, но он же "дебил"...
Если бы комп был один, то не проблема, а т.к. их 300, то...
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39744984
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tarakanasutp2так это не проблема. У службы настраиваете свои права, у приложения свои - это же разные exe-шники.
Вопрос и сводиться к тому, чтобы один exe запускался с разными правами.поясни
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39744987
tarakan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
asutp2поясни
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
//  Непосредственно запуск уведомляющего приложения,
//  в контексте интерактивного десктопа
// =============================================================================
function ShowNotify(const Value: string): DWORD;
const
  WINDOW_STATION_NAME = 'Winsta0';
  APPLICATION_DESKTOP_NAME = 'Default';
var
  hLib: THandle;
  hCurrentWinStation, hInteractiveWorkstation: HWINSTA;
  hDefaultDesktop: HDESK;
  SI: TStartupInfo;
  PI: TProcessInformation;
  SessionId: DWORD;
  hInteractiveToken: THandle;
  WTSQueryUserToken: TWTSQueryUserToken;
begin
  Result := NO_ERROR;
  hInteractiveToken := INVALID_HANDLE_VALUE;
  if (Win32MajorVersion = 5) and (Win32MinorVersion = 0) then
  begin
    // В случае W2K
    hCurrentWinStation := GetProcessWindowStation;
    // Открываем рабочую станцию пользователя
    hInteractiveWorkstation := OpenWindowStation(
      PChar(WINDOW_STATION_NAME), False, MAXIMUM_ALLOWED);
    if hInteractiveWorkstation = 0 then Exit;
    try
      // Подключаем к ней наш процесс
      if not SetProcessWindowStation(hInteractiveWorkstation) then Exit;
      try
        // Открываем интерактивный десктоп
        hDefaultDesktop := OpenDesktop(PChar(APPLICATION_DESKTOP_NAME),
          0, False, MAXIMUM_ALLOWED);
        if hDefaultDesktop = 0 then Exit;
        try
          // Перечисляем окна десктопа с целью извлечь
          // токен залогиненного пользователя
          EnumDesktopWindows(hDefaultDesktop, @EnumDesktopWindowsCallback,
            Integer(@hInteractiveToken));
        finally
          CloseDesktop(hDefaultDesktop);
        end;
      finally
        SetProcessWindowStation(hCurrentWinStation);
      end;
    finally
      CloseWindowStation(hInteractiveWorkstation);
    end;
  end
  else
  begin
    // В случае Windows ХР и выше подгружаем библиотеку
    hLib := LoadLibrary('Wtsapi32.dll');
    if hLib > HINSTANCE_ERROR then
    begin
      // Получаем адрес функции WTSQueryUserToken
      @WTSQueryUserToken := GetProcAddress(hLib, 'WTSQueryUserToken');
      if Assigned(@WTSQueryUserToken) then
      begin
        // Получаем ID сессии в рамках которой
        // ведет работу залогиненый пользователь
        SessionID := WTSGetActiveConsoleSessionId;
        // Получаем токен пользователя
        WTSQueryUserToken(SessionID, hInteractiveToken);
      end;
    end;
  end;
  if hInteractiveToken = INVALID_HANDLE_VALUE then
  begin
    Result := GetLastError;
    Exit;
  end;
  // После того как токен получен - производим запуск самого себя
  // с параметром notify и параметрами, которые необходимо отобразить
  try
    ZeroMemory(@SI, SizeOf(TStartupInfo));
    SI.cb := SizeOf(TStartupInfo);
    SI.lpDesktop := PChar(WINDOW_STATION_NAME + '\' +
      APPLICATION_DESKTOP_NAME);
    if not CreateProcessAsUser(hInteractiveToken,
      PChar(ParamStr(0)),
      PChar('"' + ParamStr(0) + '" -notify ' + Value), nil, nil, False,
      NORMAL_PRIORITY_CLASS, nil, nil, SI, PI) then
      Result := GetLastError;
  finally
    CloseHandle(hInteractiveToken);
  end;
end;


Так понятно?
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39744996
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tarakanТак понятно?

Это точно противоречит тому, что ты говорил раньше о "компьютерах за которыми никто не сидит".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39744998
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tarakanПредполагается что залогиненный (активный) пользователь будет работать с ограниченными
правами до нельзя

Если ты знаешь как ограничить пользователю право использования TCP/IP подключения к
localhost - поделись, а то я не в курсе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Иконка в трее для службы
    #39745005
tarakan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,
А при чем здесь tcp???
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Иконка в трее для службы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]