Главная страница
    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.54 MB
Время: 0.045 c
15-1198324676
Kostafey
2007-12-22 14:57
2008.02.03
К вопросу о культурном проектировании реляционных БД


2-1199825695
Петька
2008-01-08 23:54
2008.02.03
Оценка алгоритмов


2-1199495124
bagira
2008-01-05 04:05
2008.02.03
Динамическое создание Label ов


4-1181927957
=BuckLr=
2007-06-15 21:19
2008.02.03
Посыл клав. события - помогите переделать процедуру


3-1190717814
Nemec
2007-09-25 14:56
2008.02.03
InterBase





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский