Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.21;
Скачать: CL | DM;

Вниз

Как отрефрешить трей?   Найти похожие ветки 

 
Mutilator   (2004-11-05 10:37) [0]

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

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

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

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


 
Reindeer Moss Eater ©   (2004-11-05 10:41) [1]

ShellNotifyIcon


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

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


 
Reindeer Moss Eater ©   (2004-11-05 10:54) [3]

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


 
VMcL ©   (2004-11-05 11:03) [4]

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

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


 
Reindeer Moss Eater ©   (2004-11-05 11:09) [5]

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


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

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

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


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

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


 
KSergey ©   (2004-11-05 12:42) [8]

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

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


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

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


 
MacroDenS ©   (2004-11-05 13:28) [10]

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


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

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

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

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

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

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


 
KSergey ©   (2004-11-05 13:37) [12]

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

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


 
sniknik ©   (2004-11-05 15:43) [13]

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


 
DiamondShark ©   (2004-11-05 19:09) [14]

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


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 23:18) [15]

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;


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

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


 
sniknik ©   (2004-11-05 23:36) [17]

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

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



Страницы: 1 вся ветка

Текущий архив: 2004.11.21;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.029 c
1-1099897667
zokzok
2004-11-08 10:07
2004.11.21
OnPaint


14-1099486160
Shiza
2004-11-03 15:49
2004.11.21
Total Commander


14-1099398731
False_Delirium
2004-11-02 15:32
2004.11.21
Вакансия! Разработчик игр.


14-1099166665
Vaitek
2004-10-31 00:04
2004.11.21
Управление трафиком


14-1099596297
To day
2004-11-04 22:24
2004.11.21
Почему код D больше чем код C++