Форум: "Основная";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];
ВнизКак отрефрешить трей? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.041 c