Форум: "WinAPI";
Текущий архив: 2002.05.16;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.05.16;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c