Форум: "WinAPI";
Текущий архив: 2002.09.02;
Скачать: [xml.tar.bz2];
ВнизSystem Trey Найти похожие ветки
← →
guliver (2002-06-26 06:00) [0]Люди-человеки, подскажите, можно ли спрятать иконку из трея, если можно, то как?
Заранее благодарен.
← →
Song (2002-06-26 09:02) [1]Как это понять "спрятать из трея" ?
← →
Proton (2002-06-26 09:09) [2]Свою иконку ? (в смысле создал ее ты?)
← →
Poirot (2002-06-26 16:20) [3]Короче, Склихасовские, не надо так над челом глумиться....
Чел.... тебе просто надо поискать в ФАке на этом сайте.... или просто в нете....
тут этот вопрос недавно задавали...................
← →
Fenix (2002-06-26 17:17) [4]Скажите мне как узнать дескриптор дочернего окна, класс которого я знаю.
← →
Fenix (2002-06-26 17:17) [5]Тогда я смогу ответить на вопрос!
← →
guliver (2002-06-27 07:13) [6]To Proton> иконка не моя
To Song> нужно спрятать иконку не моей проги (а не весь трей), в смысле, чтобы ее не было видно
← →
Proton (2002-06-27 15:20) [7]Да млин вопросец.
-Сложно но можно.
1) Самый простой способ
- замочить приложение которое ее создало. (и обновить трай)
- Но тебя наверное это не устраивает.
2)
-Вот этот способ как раз и подлежит детальному изучению. Рассмотрим как иконка -добавляется в трей
Sends a message to the system to add, modify, or delete an icon from the taskbar status area.
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage, // message identifier
PNOTIFYICONDATA pnid // pointer to structure
);
-Да да именно так а не какой нибудь компонентой.
-Параметры
DWORD dwMessage, // message identifier
-показывает что с ней сделать (добавить/удалить/изменить)
PNOTIFYICONDATA pnid // pointer to structure
-структура добаляемой иконки
-Так вот смотрим поля этой структуры
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
char szTip[64];
-На uFlags,hIcon,szTip нам плевать (не нужны), cbSize - можно заполнить самим.
-Остается hWnd,uID,uCallbackMessage
-Вот тут то и тупик.
- во первых
hWnd - может быть любой - ну это фигня его можно определить перебором
- Во вторых
uID
- он же Application-defined identifier of the taskbar icon. - присваивается от -балды - то есть полностью зависит от фантазии автора процентов на 40 можно -утверждать что это 100 или 13 или 666 (иногда дата рождения автора) - вообщем если -его не знаеш то копец
- Ну и на последок uCallbackMessage - тоже вешица (обычно равен WM_USER+100).
-Так вот узнать все это дело можно примерно так.
1)вешаем хук на систему
2)кидаем сообщение в окошко трай (да да это то же окно заведи WS32 и узнаеш его -имя и класс) - WM_MOUSEMOVE - наример
3)система думет это это юзверь суетится и зная uID посылает нужному окну мессаги
4)твой хук есстественно их обрабатывает (вот это как раз можеш сделать с помощь WS32)
- тебе нужны окна получившие сообщения > WM_USER
5) вот в это сообщение как раз и сказан uID твоей иконки (точно непомню но вроде WParam).
---
-Вот вроде и получается что все что тебе надо тебе известно
1) хендл окна создавшего иконку (можеш запомнить его имя и класс и потом наодить -через FindWindow)
2) uID - получаеш из сообщения перехвачнного тобой (перезапусти программу -создающею иконку - проверить не меняется ли - если меняется то нужно определять -каждый раз перед удалением)
3) uCallbackMessage
-Составляеш PNOTIFYICONDATA и удаляеш иконку.
← →
Almaz (2002-06-28 00:13) [8]В дополнение к Proton © (27.06.02 15:20) - uCallBackMessage для удаления иконки знать не нужно.
Удачи.
← →
Raptor (2002-06-28 16:28) [9]2 Proton
Это все, конечно, хорошо, но хуки здесь ни к чему. :-)
Я как то отвечал на подобный вопрос, но эта ветка уже в архиве. Посему приведу здесь свой старый ответ.
Убрать иконку можна примерно так:
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;
Причем этот uID надо найти всего один раз. Он не меняется от запуска к запуску приложения.
Например для WinAmp 2.78 праметры такие
Класс="Winamp v1.x"
uID=502
← →
Proton (2002-06-28 23:38) [10]2Raptor
понимаю понимаю но ваше решение подходит только для программ где иконка создана без компоненты - апями (винамп писан ведь на Visual C++).
а если скажем программа написанна на Delphi ? да еще компонентой какой нить левой
оппаа
смотрим
Wnd:=FindWindow("здесь класс окна, которое установило иконку",
"здесь заголовок окна");
вот вот а узнаем класс окна телепатическим способом :)
Такие компоненты работают то не так как хочется.
во первых они обычно создают свое невидимое окошко - сам такие писал (исходники TTimer - для примера можно глянуть).
Вот для этого хук и нужен. (кстати можно юзать и WS32)
uID - то же под вопросом. Это только в теории он не меняется.
А если компоненты две - естественно две иконки - кто знает автора мож он на Random или еще как все это повесил. Ведь не все компоненты создают окошко - он могут перехватыват сообщения форме на которой лежат (SetWindowLong+GWL_WNDPROC)
по поводу перебора идея не плохая - сам об этом думал.
в конечном счете все решится в зависимости от того какому приложению надо иконку спрятать.
а вообще дело пары менут -
1)завести WS32 поставить настройка для отбора сообщений имя процесса (с остальных выделение снять)
2)поствить отбор сообщений в групе Other
3)поводиь мышкой над траем
4)посмотреть какому окошку это идет (вот его имя и класс) и уид
5)все больше неизвестных нет - уравенние решено
/// я сейчас с мышкой (the bat) игрался - вроде вышло - вот только окошко через FindWindow - тяжело найти будет TPUtilWindow - класс, а имени вообще нет. и таких окон как с... нерезанных (там ведать таймеров штук 40).
← →
Raptor (2002-06-29 22:30) [11]понимаю понимаю но ваше решение подходит только для программ где иконка создана без компоненты - апями (винамп писан ведь на Visual C++).
При чем здесь то на чем написано приложение. Здесь нет абсолютно никакой разницы. На чем бы оно не было написано оно все равно использует апишную функцию Shell_NotifyIcon(). Тут проблема в том как найти хендл родительского окна и uID иконки. Если известен хендл родительского окна, то uID иконки, как я уже писал, находится перебором, а способ нахождения родительского окна зависит от того кто ищет. Можно использовать SPY++, WS32 или что то другое - без разницы. Главное найти имя класса и заголовок окна. То что заголовок может отсутствовать не критично, ведь в функции FindWindow() один из параметров может быть nil. Если окон с таким классом много, то можно перебрать все такие окна и для каждого окна выполнить Shell_NotifyIcon(NIM_DELETE, ...) до положительного результата (функция должна вернуть True). Такой метод даст возможность избавиться от хуков, а значит и от лишней ДЛЛ, что, на мой взгляд, большой плюс.
uID - то же под вопросом. Это только в теории он не меняется.
Нет, это не под вопросом. ;-))
uID не меняется ни в теории ни на практике. Он, обычно, жестко задается один раз программером и каждый раз при запуске приложения для иконки в трее используется один и тот же uID. Не спорю, конечно можно предположить, что программер ставит uID каждый раз по рандому, но я такого еще в дикой природе не встречал. ;-))
Да и вряд ли кто то будет страдать такой фигней - зачем?
в конечном счете все решится в зависимости от того какому приложению надо иконку спрятать.
Во-во. К каждому приложению подход отдельный, но общая идея описана выше.
← →
Proton (2002-06-30 00:31) [12]2Raptor
Я что тут сам с собой говорю. Я слова на ветер не бросаю. если что то пишу то подверждаю
аргументами.
Вы тут прокоментировали пару моих высказований.
1)
>На чем бы оно не было написано оно все равно использует апишную функцию
>Shell_NotifyIcon().
это я говорил еще в своем первомм сообщении
2)
>При чем здесь то на чем написано приложение. Здесь нет абсолютно никакой разницы.
разница есть - очень печально что вы ее не видите.
Одно дело искать так
FindWindow ("Winamp v1.x",nil) а другое
FindWindow ("TPUtilWindow",nil) - учитывая что их штук 40 имени нет - так что годай на какое окно повешена иконка.
>заголовок может отсутствовать не критично, ведь в
>функции FindWindow() один из параметров может быть nil.
я же привел пример с мыщью (the bat) - что вы зесь будите делать
подбирать уид для всех окон - FindWindow найдет первый хендл и опппа все !!!
Как раз тут я бы и использовал предложенный вами перебор (по моему -способ для тех кто не хочет думать головой)
что то вроде
wnd := FindWindow ("TPUtilWindow",nil);
while wnd <> 0 do
begin
deleteicon()// процедура удаления иконки - надо написать самому
wnd := FindWindowEx(0,wnd,"TPUtilWindow",nil); // и то не уверен - прокатит ли
end;
3)
>uID иконки, как я уже писал, находится перебором
>Нет, это не под вопросом. ;-))
>uID не меняется ни в теории ни на практике.
>Он, обычно, жестко задается один раз программером и
>каждый раз при запуске приложения для иконки
>в трее используется один и тот же uID.
вы же мастер - чтож вы народу мозги пудрите - перебор - способ где головой думать не надо - а я дал действенный совет - если иконки 2 а надо удалить одну. Я же сразу сказал что этот UIВ в WParam"е хранится. И если смотриш используя WS32 это сразу видно.
По поводу того предложения меняется ли он или нет я сразу привел аргумент. И при чем не стоит заострять внимание на Random - все зависит от програмиста (от того хочет он думать или нет). Я же сказал иконок несколько - что делать UID нужны разные (если сообщения обрабатывает одно окно).
4)
>Во-во. К каждому приложению подход отдельный, но общая идея описана выше.
отмечу что все описанное мной в этом сообщении было сказанно раньше. Очень печално что вы прочитали написанное не внимательно.
Я думаю вопрос можно закрыть ?
← →
Raptor (2002-06-30 22:03) [13]Я что тут сам с собой говорю.
Скорее всего сам с собой. ж-))
Потому что если бы Вы внимательно прочитали то, что я написал, предыдущего поста скорее всего не было бы.
Я думаю вопрос можно закрыть ?
Если автор вопроса все уже понял, то вопрос закрыт. Если не понял, то пускай спрашивает и я постараюсь ответить на ЕГО вопросы.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.09.02;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.007 c