![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как отрефрешить трей? [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