Текущий архив: 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.047 c