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

Вниз

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

 
nimble ©   (2002-03-14 05:08) [0]

Прошу прощения, вопрос изначально был задан не врено!
Люди добрые, поможите!
Как сделать так, чтобы иконка чужой проги (пусть WinAmp)в SysTray исчезла, но прога не умерла!!!
Заранее благодарен!!!


 
Fellomena   (2002-03-14 12:30) [1]

Инструмент один - Win32API.
Попробуй так:
получаешь дескриптор панели задачь (лекго), получить дескриптор нужной тебе иконки (если она имеет дескриптор),
и если таковой имеется - просто SendMessage(Tray_handle, WM_CLOSE, 0, 0);
или можно попробовать WindowState(Tray_handle, WS_HIDE);

Хотя это только мои домыслы - конкретно это я не делала. (но с кнопкой Пуск развлекалась - вышепреведённая схема работает =)


 
Nebula ©   (2002-03-14 12:54) [2]

Tray - это Toolbar, а иконки - Buttons. Поэтому работаем с ним как с обычным Toolbar. Через сообщение TB_DELETEBUTTON.

Расположение окон:
Shell_TrayWnd
- TrayNotifyWnd
- ToolbarWindow32

FTrayToolbar := FindWindowEx(FindWindowEx(FindWindow("Shell_TrayWnd", ""), 0, "TrayNotifyWnd", ""), 0, "ToolbarWindow32", "");
SendMessage(FTrayToolbar, TB_DELETEBUTTON, ButtonIndex, 0);



 
Fellomena   (2002-03-14 12:59) [3]

2 Nebula:
угу, теперь понятно.
Значит они точно handle не имеют.
А можно эти иконки идентифицировать не по индексу, а по какому-либо ещё критерию ?
Ведь порою некоторые программы вставляют и удаляют свои иконки достаточно быстро...


 
Nebula ©   (2002-03-14 13:12) [4]

см help по Toolbar, все что найдешь - все твое. Только маленькое дополнение - это win32 control, т.е. появился с Windows 95, а значит у вас разные адресные пространства и как следствие - невозможность передавать указатели в сообщениях. :( Хотя методы, конечно, есть, но это совсем другая сказка. А эта кончилась, все плохие иконки убили, все хорошие - погибли в бою...


 
paul_shmakov ©   (2002-03-14 15:09) [5]

2 Fellomena (14.03.02 12:59):
можно глобальным хуком перехватывать попытки что-либо делать с иконками в трее.
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1015937269&n=5


 
Fellomena   (2002-03-14 17:09) [6]

2 paul_shmakov: угу... тоже дело, спасибо за линк 8)


 
Raptor ©   (2002-03-14 19:56) [7]

Да, народ, ну и наворотили же вы тут. Даже хуки задействовали. :-))
Я, конечно, не спорю. Можно и так. Но лично я такую проблему проще решал. Стандартными, так сказать, методами. Идея проста. Раз прога установила иконку в трей и удаляет ее оттуда при выходе, то почему я немогу от ее имени этого сделать?
Ну вот и делаю:

Var FIconData:TNotifyIconData;
.......................
With FIconData Do Begin
cbSize:=SizeOf(FIconData);
Wnd:=FindWindow("здесь класс окна, которое установило иконку",
"здесь заголовок окна");
uID:=<здесь ставим ID иконки>;
uFlags:=NIF_ICON;
End;
i:=Shell_NotifyIcon(NIM_DELETE,@FIconData);

Главная проблема здесь найти ID иконки (мы же не знаем какой ID поставила прога, установившая иконку). Но эта проблема легко решается. Например так:

While not Shell_NotifyIcon(NIM_DELETE,@FIconData) Do Begin
FIconData.uID:=FIconData.uID+1;
End;
ID:=FIconData.uID;

Например для WinAmp 2.78 праметры такие
Класс="Winamp v1.x"
uID=502


 
paul_shmakov ©   (2002-03-15 05:47) [8]

2 Raptor:
ну я как раз для определения uID и предлагал хуки использовать :)
uID - это DWORD... перебор от 0 до 4294967296 с посылкой сообщения - не самый шустрый вариант, но все же вариант.
хотя для такой простой задачи можно действительно поперебирать идентификаторы. для более сложных вещей лучше использовать хук (см.выше).


 
Raptor ©   (2002-03-15 11:42) [9]

Все правильно, только вот перебор этот надо сделать только один-единственный раз. Только что бы найти его, этот номер. Потом просто использовать его для удаления иконки. Он ведь константа и никогда не меняется.
А по поводу DWORD-а, так я никогда еще не встречал uID больше чем 1000. Хотя все возможно. ;-)


 
paul_shmakov ©   (2002-03-15 11:49) [10]

да, полностью согласен. способ простой и действенный.



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

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

Наверх




Память: 0.49 MB
Время: 0.012 c
1-49919
VS2001
2002-05-03 08:52
2002.05.16
Как выполнить следующее действие ...


1-50017
oomneeq
2002-04-30 18:39
2002.05.16
DLL и переменная Application


14-50116
asafr
2002-04-04 18:59
2002.05.16
WINGATE 4.1.0 , будь он неладен!!!!!


14-50103
SPeller
2002-04-07 03:14
2002.05.16
Как подписаться на RSDN Magazine ???


3-49873
AlexL
2002-04-19 18:00
2002.05.16
Какую СУБД выбрать