Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
14-3619
MeamoryLeak
2002-08-06 14:08
2002.09.02
Непростая задачка... кому интересно...


4-3673
dihlos
2002-07-01 18:13
2002.09.02
Как узнать handle дочерних окон приложения?


6-3552
Belg
2002-06-18 07:31
2002.09.02
Как проверить, существует ли определенный e-mail или нет?


1-3424
blazze
2002-08-22 23:02
2002.09.02
Модули


4-3663
SeB
2002-06-20 10:59
2002.09.02
Блокировка машины в Windows и неубиваемая программа





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский