Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как отрефрешить трей? [D7, Win2k, WinXP]


Mutilator ©   (2004-11-05 10:37:00) 

Есть прога, которая переодически убивает жестко (Terminate process) другую прогу, после чего запускает ее вновь. Этот цикл бесконечен и неважно для чего он сделан. Трабл такой:

Та софтина, которую убивают/запускают имеет в трее свою иконку. Если закрывать ее нормальным способом, то и ее иконка соотв. удалиться из трея. Но если убивать как процесс (из таскманагера, допустим), то иконка останется.

Подскажите, а лучше дайте кусок кода, как отрефрешить програмно трей, чтобы исчезли иконы уже несуществующих программ?

Если непонятно объяснил - скажите - разжую поподробнее..


sniknik   (2004-11-05 23:36:00) [1]

> А еще панель задач может быть вертикальной :-)
да, и тогда тому кому это нужно придется взять и исправить под свои нужды... ;о))

если уж говорить о недостатках кода то в моем еще один есть, для XP у которого обратное по сравнению с w2k расположение значков, возможны "пропуски" при "снимании" большого количества пустышек, изза того что размер окна меняется и возможны "перескакивания" через значки.
тоже оставляю на усмотрение спрашивающего т.к. XP не имею и недостаток чисто "расчетный".


Ученик   (2004-11-05 23:25:00) [2]

А еще панель задач может быть вертикальной :-)


sniknik   (2004-11-05 23:18:00) [3]

DiamondShark ©   (05.11.04 19:09) [14]
немного не то, заметен шлейф мыши и мигание.
у меня получше получилось
(на всякий случай, писалось/тестировалось только в w2k)

function FindToolbar: HWnd;
begin
 Result:= FindWindow('Shell_TrayWnd', '');
 if Result = 0 then Exit;
 Result:= FindWindowEx(Result, 0, 'TrayNotifyWnd', nil);
 if Result = 0 then Exit;
 Result:= FindWindowEx(Result, 0, 'ToolbarWindow32', nil);
end;

procedure RefreshTray;
var
 i: Integer;
 Rect: TRect;
 TrayWnd: HWnd;
begin
 TrayWnd:= FindToolbar;
 if TrayWnd <> 0 then begin
   GetWindowRect(TrayWnd, Rect);
   i:= Rect.Right - 5;
   while i > Rect.Left do begin
     SendMessage(TrayWnd, WM_MOUSEMOVE, 0, MakeLong(i - Rect.Left, 5));
     Dec(i, 10)
   end
 end
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 RefreshTray;
end;


DiamondShark   (2004-11-05 19:09:00) [4]

Вот так "отрефрешить трей":


procedure TForm1.Button1Click(Sender: TObject);
var
 wnd: HWND;
 R: TRect;
 y: integer;
 x: integer;
 SH, SW: integer;
 M: TPoint;
begin
 GetCursorPos(M);

 SW := GetSystemMetrics(SM_CXSCREEN);
 SH := GetSystemMetrics(SM_CYSCREEN);

 wnd := FindWindow('Shell_TrayWnd', nil);
 wnd := FindWindowEx(wnd, 0, 'TrayNotifyWnd', nil);
 Windows.GetClientRect(wnd, R);
 MapWindowPoints(wnd, 0, R, 2);
 y := (R.Top + R.Bottom) div 2;
 for x := R.Left to R.Right do
   begin
     mouse_event(MOUSEEVENTF_MOVE or MOUSEEVENTF_ABSOLUTE,
       x * 65535 div SW,
       y * 65535 div SH,
       0, 0);
     sleep(0);
   end;

 SetCursorPos(M.x, M.y);
end;


sniknik   (2004-11-05 15:43:00) [5]

> вроде советовали найти окно трея (которое имеет стандартные парамтеры типа имени класса) и отрефрешить его...
не видел обсуждения но сам пробовал, не получилось, т.е. рефреш посылается и даже перерисовывается но "пустые" иконки не убирает, получилось только эмуляцией "проведения" мыши над этим окном. (найти код можно, только он дома (вот всегда так когда дома то о рабочем коде вспоминаеш ;), впрочем он может быть и потерян... в виду не особо большой ценности (просто эксперимент))


KSergey   (2004-11-05 13:37:00) [6]

> [11] Reindeer Moss Eater ©   (05.11.04 13:33)
> Я дал неверный ответ, который, будь даже и верным, в любом
> случае неприменим... Зашибись.
>
> Хочешь - зашибись себе наздоровье.

"Зашибись" в данном случае - не глагол ;)
Впрочем, мое высказывание было в том смысле, что в [5] не была признана очепятка.


Reindeer Moss Eater   (2004-11-05 13:33:00) [7]

>KSergey ©   (
Подскажите, а лучше дайте кусок кода, как отрефрешить програмно трей, чтобы исчезли иконы уже несуществующих программ?

Так вот. "Рефрешить" трей можно до посинения.
Если Shell_NotifyIcon не вызвана что бы убрать иконку, то икона там останется.

Спрашивали как убрать.
Я ответил как убрать.
То, что у автора нет необходимых данных что бы воспользоваться ответом - проблема не моя.

Я дал неверный ответ, который, будь даже и верным, в любом случае неприменим... Зашибись.

Хочешь - зашибись себе наздоровье.


MacroDenS   (2004-11-05 13:28:00) [8]

Можно рассылать сообщение рабочему столу на UpDate (кнопка F5), но тогда могут возникнуть проблемы с мерцанием, если прога запускается/убивается достаточно быстро.


KSergey   (2004-11-05 12:43:00) [9]

Первая строчка - к Reindeer Moss Eater, если что.


KSergey   (2004-11-05 12:42:00) [10]

Я дал неверный ответ, который, будь даже и верным, в любом случае неприменим... Зашибись.

Я могу дико ошибаться, но какое-то смутное у меня воспоминание осталось от обсуждения подобного ворпса на форуме - вроде советовали найти окно трея (которое имеет стандартные парамтеры типа имени класса) и отрефрешить его...


Reindeer Moss Eater   (2004-11-05 12:22:00) [11]

Время покажет, что он не знает идентификаторов, с которыми иконки "запузыривались в трей".
Правда остается брутфорс


VMcL   (2004-11-05 12:01:00) [12]

>> Reindeer Moss Eater ©  (05.11.04 11:09) [5]

Время покажет...


Reindeer Moss Eater   (2004-11-05 11:09:00) [13]

Какая разница?
Все равно это ему не поможет.


VMcL   (2004-11-05 11:03:00) [14]

>> Reindeer Moss Eater ©  (05.11.04 10:54) [3]

Про ShellNotifyIcon в справке, конечно, ничего нет. А вот про Shell_NotifyIcon - есть.


Reindeer Moss Eater   (2004-11-05 10:54:00) [15]

Извини, но в хелпе про ShellNotifyIcon все есть


Mutilator   (2004-11-05 10:50:00) [16]

Извини, в хелпе про ShellNotifyIcon ничего нет... Как им пользоваться?
Имейте ввиду, что прога, которая имеет иконку в трее не знает, что ее "лупят" - соотв. она сама за собой подчищать ничего не сможет. Подчищать надо той прогой, которая убивает...


Reindeer Moss Eater   (2004-11-05 10:41:00) [17]

ShellNotifyIcon


Наверх

Титульная страница Поиск, карта сайта Написать письмо