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

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

Tray


Страницы:   1 2

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; с информацией об иконке.


Страницы:   1 2

Наверх

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