Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Иконка в трее для службы, Иконка в трее для службы 
:(
    Опции темы
tarakan
Дата 7.12.2018, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 11.11.2008

Репутация: нет
Всего: нет



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

План такой : По запуску службы запустить функцию поиска активного десктопа и на нем нарисовать иконку.
Не могу в коде это все соединить в одно целое. Нужна помощь знатоков.

PM MAIL   Вверх
ZBugz
Дата 8.12.2018, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 631
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Я тут решил мысль подкинуть....
Я ни разу не делал такое и вот подумал вспомнив одну программу: а почему не делать иконки на всех рабочих столах ?
PM MAIL   Вверх
tarakan
Дата 9.12.2018, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 11.11.2008

Репутация: нет
Всего: нет



Да, в будущем дойдем и до этого, но для начала нужно освоить задачу минимум.
PM MAIL   Вверх
Hiori
Дата 10.12.2018, 07:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 29.3.2016

Репутация: нет
Всего: нет



а можно спросить зачем? я так понимаю, что иконка нужна для отображения активности/простоя/прогресса действий и т.п.? почему не пойти по общепринятому пути и не написать попутно сервису некий монитор, который и будет содержать в себе исключительно обработку трея и некую визуализацию работы сервиса?

перефразирую свой вопрос - чем вас конкретно не устраивает подобный "монитор"

Это сообщение отредактировал(а) Hiori - 10.12.2018, 07:33
PM MAIL   Вверх
neweraser
Дата 31.1.2019, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 17.2.2008

Репутация: нет
Всего: 6



Hiori, совершенно верно. Идея рисовать иконку на всех рабочих столах как-то не очень звучит, а вот с монитором сам писал службы. Автору советую взглянуть в сторону pipes, не помню подробностей, но таким способом служба взаимодействовала с программой мониторинга.


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
kami
Дата 12.3.2019, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(tarakan @  7.12.2018,  17:24 Найти цитируемый пост)
 запустить функцию поиска активного десктопа и на нем нарисовать иконку.

и
Цитата(tarakan @  7.12.2018,  17:24 Найти цитируемый пост)
сделать иконку в трее

это две большие разницы.

Чтобы создать иконку в трее требуется вызов функции ShellNotifyIcon А у нее отсутствует возможность указать оконную станцию и десктоп, с системным треем которых нужно работать. То есть - эта функция ассоциирована именно с десктопом того потока, который ее вызывает.
Если сумеете создать поток и переключить его на активный десктоп пользователя - сработает. Но увы - среди функций, ответственных за оконные станции и десктопы, нет необходимых. Т.е. теоретически надо бы начать с SetProcessWindowStation, потом SetThreadDesktop (промежуточные вызовы API упустим), но уже с самого начала сталкиваемся с проблемой: This window station must be associated with the current session. Что для сервиса, мягко говоря, совсем не так...

P.S. Это достаточно развернутый ответ. Вкратце он звучит именно так, как указано в первом сообщении: «Это неблагодарное дело, службы не работают с рабочим столом» smile

Это сообщение отредактировал(а) kami - 12.3.2019, 21:57
PM MAIL WWW   Вверх
_zorn_
Дата 17.3.2019, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



Цитата
Иконка в трее для службы

Это невозможно. Делай отдельную приложуху которая будет висеть в трее и общаться с сервисом.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1319 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.