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

Вниз

Tray   Найти похожие ветки 

 
datorn ©   (2008-01-06 11:44) [0]

Народ, подскажите, как обновить (перерисовать) трэй. Удаляю все процессы, а иконки остаются в трэе, пока не проведешь там мышкой.


 
@!!ex ©   (2008-01-06 11:47) [1]

procedure TrayDelete;
begin
 nid.uFlags := 0;
 Shell_NotifyIcon (2, @nid);
end;


Где nid:TNotifyIconData; с информацией об иконке.


 
DVM ©   (2008-01-06 11:54) [2]


> @!!ex ©

Он похоже убивает чужие процессы принудительно. Так что это не подойдет.


 
datorn ©   (2008-01-06 11:54) [3]


> Где nid:TNotifyIconData; с информацией об иконке.


а где я возьму информацию об иконке, если она создана посторонним процессом? нет ли функции, которая просто обновляет трэй?


 
@!!ex ©   (2008-01-06 12:01) [4]

> [3] datorn ©   (06.01.08 11:54)

InvalidateRect?


 
DVM ©   (2008-01-06 12:06) [5]


> InvalidateRect?

Не поможет, попробуй. Эксплорер хранит информацию об иконках в своем списке и удаляет только по требованию или в случае, если окно приложения, добавившее иконку не найдено.

Я как то встречал метод удаления иконки чужого процесса, там что то с перебором окон было.


 
MetalFan ©   (2008-01-06 12:11) [6]

может сообщение какое трею послать?


 
datorn ©   (2008-01-06 12:20) [7]

InvalidateRect не помогает


 
DVM ©   (2008-01-06 12:20) [8]


> может сообщение какое трею послать?

Я даже знаю какое WM_COPYDATA. И параметры какие знаю. Но дело не в этом. Его и так пошлет Shell_NotifyIcon. Надо в праметры правильные значения положить. С этим сложнее.


 
@!!ex ©   (2008-01-06 12:23) [9]

> InvalidateRect не помогает

На самом деле если подумать, можно было и не пробовать...
У меня TaskBar скрывается и открывается, а икони не пропадают...


 
DVM ©   (2008-01-06 12:29) [10]

Мне вообще непонятно, почему до сих пор MS не реализовала такую простую и очевидную вещь, как проверка по таймеру списка иконок и проверка на существование соответствующих им окон. А также сохранение и восстановление списка после аварийного перезапуска эксплорера.


 
datorn ©   (2008-01-06 12:31) [11]

Блин, ну что делать!? Вот нашел код, чтобы скрыть/показать трэй. Думал, это обновит трэй, но не помогает

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;


 
datorn ©   (2008-01-06 12:34) [12]

Значит, остается только перезапустить explorer. Других путей решения проблемы не вижу


 
@!!ex ©   (2008-01-06 12:36) [13]

> [12] datorn ©   (06.01.08 12:34)

И убить ВСЕ иконки? :))


 
DVM ©   (2008-01-06 12:37) [14]


> Блин, ну что делать!? Вот нашел код, чтобы скрыть/показать
> трэй. Думал, это обновит трэй, но не помогает

Не майся ерундой. Мне прекрасно известен принцип работы области уведомлений эксплорера - это не поможет. У него свой список.
Удалить можно двумя способами: перезапустить сам эксплорер или отправить сообщени об удалении иконки. Но для этого нужно знать хэндл окна и вероятно хэндл иконки (насчет последнего не уверен). Хэндл окна надо узнавать перед прибитием процесса, перебирая его окна.


 
DVM ©   (2008-01-06 12:38) [15]


> И убить ВСЕ иконки?

Правильно написанные программы должны восстановить свои иконки, после получения широковещательного сообщения о создании окна панели задач.


 
@!!ex ©   (2008-01-06 12:40) [16]

> [15] DVM ©   (06.01.08 12:38)

Перезагрузка explorera показала, что из 20 иконок вживых осталось меньше половины... и те почти все виндовые... а у вас?


 
DVM ©   (2008-01-06 12:43) [17]


> а у вас?

а у меня их мало 10 всего и из них половина ShellServiceObjects(виндовые) - остальные 5 восстанавливаются.


 
@!!ex ©   (2008-01-06 12:47) [18]

Picasa2
Net Peeker
Довольно известные софтины.. не перезагрузились...


 
DVM ©   (2008-01-06 12:52) [19]


> не перезагрузились...

Разработчики постоянно забывают об этом. MS вроде как хотела сделать сохранение списка иконок, но что-то никак пока. Хотя в висте может сделала, я не присматривался.


 
@!!ex ©   (2008-01-06 12:53) [20]

> Разработчики постоянно забывают об этом.

Я тоже отношусь к этим разработчикам. :)
Хотя т сложно забыть то, чего не знаешь. :))


 
sniknik ©   (2008-01-06 13:06) [21]

> Значит, остается только перезапустить explorer. Других путей решения проблемы не вижу
гораздо легче решение, провести над треем мышкой... программно, быстро, никто и не заметит.

но вообще вроде действительно, как говорили, есть метод доступиться непосредственно к нему... насколько помню. но только для XP/2000 в 98м это просто картинки на панели (не обьекты с которыми можно работать)

т.е. сделать более менее нормально можно, но...
вопрос только один возникает, а нафига ты "рубишь" чужие процессы, вместо нормального их закрытия? это уже само по себе ненормально, и после этого желание нормальности в иконках довольно странно.

> Довольно известные софтины.. не перезагрузились...
потому что они их не обновляют постоянно по таймеру... (сами проги), а это их дело. не закладываются на перезапуск експлорера. (они убили Кенни. сволочи! © Южный парк)


 
sniknik ©   (2008-01-06 13:09) [22]

во, у меня оказывается ссылка сохранена
http://rouse.drkb.ru/winapi.php#fwsystrayinfo
вторая демка.


 
DVM ©   (2008-01-06 13:12) [23]


> sniknik ©   (06.01.08 13:06) [21]


> но вообще вроде действительно, как говорили, есть метод
> доступиться непосредственно к нему

Да там кнопки на тулбаре, к каждой кнопке привязана структура, подобная той, что передается при добавлении иконки, но это изврат вс же.

Я где то встречал (не помню где) довольно изящный способ удаления чужой иконки. Причем не касаясь самого тулбара с иконками. Помню лишь что там окна перебирались и что то с чем то сравнивалось. До умерщвления чужого процесса ессно.


 
sniknik ©   (2008-01-06 13:20) [24]

> Помню лишь что там окна перебирались и что то с чем то сравнивалось.
вряд ли подобное возможно, вот например сделал я окно(приложение), при старте создал иконку uID иконке поставил "от балды" например 5555. вопрос - как другое приложение перебирая окна найдет этот uID, на котором основана вся работа с иконками? это нужно скан процессу делать (на предмет вызова функции) а не окна перебирать.
в ссылке там, имхо т.к. не разбирал, он получается у самого тулбара в эксплорере (должно был так. по логике). т.е. от обратного.


 
datorn ©   (2008-01-06 13:25) [25]


> вопрос только один возникает, а нафига ты "рубишь" чужие
> процессы, вместо нормального их закрытия?


После клиентов бывает остается запущены пять-десять программ, пока все закроешь - запаришься. А так нажал на кнопочку, и все процессы рубанулись.


 
@!!ex ©   (2008-01-06 13:27) [26]

> [25] datorn ©   (06.01.08 13:25)

А послать им сообщение о закрытии корректном не судьба?


 
DVM ©   (2008-01-06 13:28) [27]


> sniknik ©   (06.01.08 13:20) [24]

Я к сожалению не помню точно, по-моему на rsdn была какая то статья про как можно более аккуратное принудительное убиение чужого процесса, там и затрагивалась тема иконок. Мне тогда показался очень оригинальным способ предложенный автором. Сути я к сожалению не помню, но точно способ отличный от предложенного Rouse, да и более простой.


 
sniknik ©   (2008-01-06 13:46) [28]

> Сути я к сожалению не помню
жаль, потому как было бы интересно, как он находит индекс для корректного удаления иконки (так понимаю через Shell_NotifyIcon раз в тулбар как Rouse не лезет).
(провести мышкой например способ проще не бывает, но на спрятанные иконки не действует. хотя, если при раскрытии винда их перепроверяет и снимает то и этот способ корректный)


 
datorn ©   (2008-01-06 13:51) [29]


> А послать им сообщение о закрытии корректном не судьба?


А что значит послать сообщение о закрытии процессам? Именно процессам, а не окнам.
Да и потом, даже если корректно закрыть прогу, икона все равно остается в трэе.


 
sniknik ©   (2008-01-06 13:55) [30]

> даже если корректно закрыть прогу, икона все равно остается в трэе.
автору рекламацию + неустойку! не будет больше полуфабрикатами торговать!


 
@!!ex ©   (2008-01-06 14:03) [31]

> [29] datorn ©   (06.01.08 13:51)

Вабчэта у оконного приложения(а если есть иконка в трее, то оно таки оконное) достаточно послать сообщение о закрытии и этого достаточно...


> Да и потом, даже если корректно закрыть прогу, икона все
> равно остается в трэе.

Какое то у вас некорректное корректное завершение...


 
datorn ©   (2008-01-06 14:06) [32]

Вот например yahoomsgr -после закрытия окна иконка остается. И у MSNа также, и у ooVoo. Список могу продолжить. Эти проги ещё и в автозагрузку прописываются


 
@!!ex ©   (2008-01-06 14:11) [33]

> [32] datorn ©   (06.01.08 14:06)


> Какое то у вас некорректное корректное завершение...


У меня MSN при закрытии после себя подчищает...


 
datorn ©   (2008-01-06 14:35) [34]

Да, это если нажать на кнопку "Выход", а если просто нажать на крестик закрытия окна или послать сообщение о закрытии, то иконка остается. А мне нужно одним нажатием закрыть все. И почисть трэй


 
datorn ©   (2008-01-06 14:35) [35]

Да, это если нажать на кнопку "Выход", а если просто нажать на крестик закрытия окна или послать сообщение о закрытии, то иконка остается. А мне нужно одним нажатием закрыть все. И почистить трэй



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

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

Наверх




Память: 0.56 MB
Время: 0.02 c
2-1199858443
Kolan
2008-01-09 09:00
2008.02.03
Как сделать сплиттер с линией в 1пикс.?


2-1200240167
Steep
2008-01-13 19:02
2008.02.03
TextFile, String - Delete


2-1199382645
buka
2008-01-03 20:50
2008.02.03
Почему не работает в ADOTable?


15-1198835285
Cj
2007-12-28 12:48
2008.02.03
Раздвоение анкет


4-1183109513
евнен
2007-06-29 13:31
2008.02.03
форматирование диска без участия пользователя