Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2018, 17:21   #1
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию Иконка в трее для службы

Здравствуйте.
Задался вопросом как сделать иконку в трее для СЛУЖБЫ. Прошу отказаться от высказываний типа : «Это неблагодарное дело, службы не работают с рабочим столом». Есть код
Код:
 
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 рисовать иконку.
Есть функция
Код:
//  Каллбэк вызываемый в случае запуска сервиса под 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;
План такой : По запуску службы запустить функцию поиска активного десктопа и на нем нарисовать иконку.
Не могу в коде это все соединить в одно целое. Нужна помощь знатоков.
tarakan1983 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Иконка в трее CraZZZy-GameRRR Общие вопросы Delphi 5 29.05.2016 16:54
Иконка в трее саша40 Общие вопросы Delphi 10 24.10.2012 14:49
Иконка в трее* Krow Win Api 5 20.07.2008 02:41
Иконка в трее Mangust Win Api 2 10.07.2008 13:43