![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Tray
datorn © (2008-01-06 11:44:00)Народ, подскажите, как обновить (перерисовать) трэй. Удаляю все процессы, а иконки остаются в трэе, пока не проведешь там мышкой.
DVM (2008-01-06 12:38:00) [21]
> И убить ВСЕ иконки?
Правильно написанные программы должны восстановить свои иконки, после получения широковещательного сообщения о создании окна панели задач.
DVM (2008-01-06 12:37:00) [22]
> Блин, ну что делать!? Вот нашел код, чтобы скрыть/показать
> трэй. Думал, это обновит трэй, но не помогает
Не майся ерундой. Мне прекрасно известен принцип работы области уведомлений эксплорера - это не поможет. У него свой список.
Удалить можно двумя способами: перезапустить сам эксплорер или отправить сообщени об удалении иконки. Но для этого нужно знать хэндл окна и вероятно хэндл иконки (насчет последнего не уверен). Хэндл окна надо узнавать перед прибитием процесса, перебирая его окна.
@!!ex (2008-01-06 12:36:00) [23]> [12] datorn © (06.01.08 12:34)
И убить ВСЕ иконки? :))
datorn (2008-01-06 12:34:00) [24]Значит, остается только перезапустить explorer. Других путей решения проблемы не вижу
datorn (2008-01-06 12:31:00) [25]Блин, ну что делать!? Вот нашел код, чтобы скрыть/показать трэй. Думал, это обновит трэй, но не помогает
procedure hideStartbutton(visi:boolean);
Var
Tray, Child : hWnd;
C : Array[0..127] of Char;
S : String;
Begin
Tray := FindWindow('Shell_TrayWnd', NIL);
Child := GetWindow(Tray, GW_CHILD);
While Child <> 0
do Begin
If GetClassName(Child, C, SizeOf(C)) > 0
Then Begin
S := StrPAS(C);
If UpperCase(S) = 'TRAYNOTIFYWND'
then begin
If Visi
then ShowWindow(Child, 1)
else ShowWindow(Child, 0);
end;
End;
Child := GetWindow(Child, GW_HWNDNEXT);
End;
End;
procedure TForm1.Button1Click(Sender: TObject);
begin
hideStartbutton(false);
hideStartbutton(true);
end;
DVM (2008-01-06 12:29:00) [26]Мне вообще непонятно, почему до сих пор MS не реализовала такую простую и очевидную вещь, как проверка по таймеру списка иконок и проверка на существование соответствующих им окон. А также сохранение и восстановление списка после аварийного перезапуска эксплорера.
@!!ex (2008-01-06 12:23:00) [27]> InvalidateRect не помогает
На самом деле если подумать, можно было и не пробовать...
У меня TaskBar скрывается и открывается, а икони не пропадают...
DVM (2008-01-06 12:20:00) [28]
> может сообщение какое трею послать?
Я даже знаю какое WM_COPYDATA. И параметры какие знаю. Но дело не в этом. Его и так пошлет Shell_NotifyIcon. Надо в праметры правильные значения положить. С этим сложнее.
datorn (2008-01-06 12:20:00) [29]InvalidateRect не помогает
MetalFan (2008-01-06 12:11:00) [30]может сообщение какое трею послать?
DVM (2008-01-06 12:06:00) [31]
> InvalidateRect?
Не поможет, попробуй. Эксплорер хранит информацию об иконках в своем списке и удаляет только по требованию или в случае, если окно приложения, добавившее иконку не найдено.
Я как то встречал метод удаления иконки чужого процесса, там что то с перебором окон было.
@!!ex (2008-01-06 12:01:00) [32]> [3] datorn © (06.01.08 11:54)
InvalidateRect?
datorn (2008-01-06 11:54:00) [33]
> Где nid:TNotifyIconData; с информацией об иконке.
а где я возьму информацию об иконке, если она создана посторонним процессом? нет ли функции, которая просто обновляет трэй?
DVM (2008-01-06 11:54:00) [34]
> @!!ex ©
Он похоже убивает чужие процессы принудительно. Так что это не подойдет.
@!!ex (2008-01-06 11:47:00) [35]
procedure TrayDelete;
begin
nid.uFlags := 0;
Shell_NotifyIcon (2, @nid);
end;
Где nid:TNotifyIconData; с информацией об иконке.