Faq system tray а как удалить иконку с tray


Faq system tray а как удалить иконку с tray ?

Lapex » 09.11.2010 (Вт) 13:24

Пишу dll к чужому приложению, имеющему иконку в системном трее. (чужое приложение умеет работать с моим dll)
Из dll я хочу достучаться к иконке приложения.

Попытка удалить иконку из трея:
Код: Выделить всё GLOBAL NID5 AS NOTIFYICONDATA5

N >N >N >N >
Shell_NotifyIcon(%NIM_DELETE, BYVAL VARPTR(NID5))

Не удаляется
Т.к. uID иконки мне не известен, то пробовал подставлять другие значения в цикле — никакой реакции.

Заранее благодарен за любые идеи.

Re: Не могу удалить иконку из трея

Dark Machine » 27.12.2010 (Пн) 9:42

для uID я использовал CurrInstance от WINMAIN

вот как я это делал.
Код: Выделить всё .
FUNCTION WINMAIN (BYVAL CurInst AS LONG, _
BYVAL PrvInst AS LONG, _
BYVAL CmdLine AS ASCIIZ PTR, _
BYVAL CmdShow AS LONG) EXPORT AS LONG

‘ Save the Instance for other calls
hInst = CurInst
.
‘ Make window to handle tray processing.
‘ This is a small (1 pixel) window.
‘ DDT will force you to «SHOW» it but it’s so small that, who will see it
‘ and thats only until it’s hidden.
DIALOG NEW %HWND_DESKTOP,»»,1,1,1,1,0 ,%WS_EX_TOPMOST OR %WS_EX_TOOLWINDOW TO hTrayDlg
.

.
ti.cbSize = SIZEOF(ti)
ti.hWnd = hTrayDlg
ti.u > ti.uFlags = %NIF_ICON OR %NIF_MESSAGE OR %NIF_TIP
ti.uCallbackMessage = %WM_TRAY
ti.szTip = $RSSTRACK & » / Connecting . »
ti.hIcon = LoadIcon(hInst,BYVAL MAKLNG(%IDR_IMGBUSY,0))

Shell_NotifyIcon %NIM_MODIFY, ti
.

Re: Не могу удалить иконку из трея

iGrok » 27.12.2010 (Пн) 16:43

Ну, тут как бы и ответить-то нечего. «Удали то, не знаю что»..

Получай список иконок, перебирай их и выясняй, кому они принадлежат.
Сходу нашлось вот это: http://www.manhunter.ru/assembler/283_p . _tree.html

Re: Не могу удалить иконку из трея

Lapex » 28.12.2010 (Вт) 12:17


Ух, сколько сразу информации .
Спасибо ребята за помощь, буду разбираться.

Faq system tray а как удалить иконку с tray ?

Поискал в FAQ — там примеры, как текст помещать в tray. А как попроще само приложение туда отправить ?

Жмем «Поиск», набираем:
Искать: TRAY
Где : FAQ

И почти сразу натыкаемся на:
http://delphi.mastak.ru/cgi-bin/faq.pl?look=1& >
а уж если по форумам поискать .

Так это через иконку. А как напрямую приложение отправить, чтобы иконка сама туда поместилась, чтобы не заботиться об иконке. А в форумах тоже искал — нет.

По всей видимости Ты не совсем понимаешь сути TRAY — туда помещается имено иконка приложения.

может тебе убрать с таскбара так это просто: в OnShow пиши showwindow(application.Handle,sw_hide);

2 Андрей Сенченко
Я, видимо, тоже не понимаю. Там же просто картинка, а все реакции на события (от мыши, например) программист задает сам какие пожелает, хоть перезапуск системы. Или нет? Разве это иконка в таком случае?

И даже в этом случае, там просто иконка

вопрос в догонку А чтобы формы ввобще не было видно при загрузке, сразу иконку в трее?

>Eraser ©
В FAQ я наше несколько способов с прятаньем главной формы при старте, но все они были немного кривы.
В RX компонентах есть компонента AppEvents ставишь в свойствах ShowMainForm False и главного окна видно не будет. Ну и компонент с иконкой в Tray тоже есть там же.

для ShowMainForm RX не нужны, а нужно написать Application.ShowMainForm после Application.Initialize в *.dpr файле

>Sasha9 ©
Век живи век учись :) спасибо, я не знал.

Faq system tray а как удалить иконку с tray ?

В продолжение статьи «Как скрыть значки в трее», в которой я конкретно затупил и написал полную ерунду, хочу предложить действительно рабочий, но и более радикальный способ скрытия трея. Минус этого способа в том, что не получится скрыть конкретно какие-то значки, исчезает полностью вся область трея, остаются только часы и языковая панель. Но зато в любой момент можно без проблем все вернуть обратно.

Для тех, кому лень тыкать мышкой в редакторе реестра, я выложил файлы notray.reg и yestray.reg, которые убирают и, соответственно, возвращают трей двумя щелчками мыши. Эстеты, которых возбуждает ковыряние в реестре, могут сделать все вручную.

Запускаем редактор реестра («Пуск» — «Выполнить» — regedit). В левой панели редактора реестра открываем следующий путь: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies. Если в разделе Policies имеется вложенный подраздел Explorer, то переходим в него. Если же раздела Explorer нет – создаем его: щелкаете правой кнопкой мыши на раздел Policies, выбираете «Создать» — «Раздел» и пишете название Explorer.

Теперь в правой части редактора реестра щелкаем правой кнопкой мыши в любом месте и выбираем «Создать» — «Параметр DWORD». Задаем ему имя NoTrayItemsDisplay, дважды щелкаем на него и записываем значение 1. Нажимаем ОК, закрываем редактор реестра и перезагружаем компьютер.


Для возвращения трея нужно будет просто удалить запись NoTrayItemsDisplay и перезагрузить машину.

Данный твик проверялся исключительно на Windows XP. Если на Семерке не прокатит – можете воспользоваться специальной утилитой Windows 7 Systemtray Hider.

— Папа, а кто лечит людей?

— Папа, а кто лечит животных?

— Папа, а кто лечит Windоws?

— Потому, сынок, что самое надежное средство вылечить Windоws — это FОRМАТ С.

Faq system tray а как удалить иконку с tray ?

1. Воспользуйся поиском — вопрос задавался уже неоднократно!
2. Вот весьма исчерпывающий ФАК по этому вопросу.

Hаиболее часто задаваемые вопросы по SystemTray.
Автор — Лев Серебряков (Lev Serebryakov),
2:5030/219.33@fidonet или lev@spb.runnet.ru
Версия 1.1

Часть 0. О чем.
Данный спиок вопросов и ответов на них содержит наиболее часто
задаваемые вопросы по использованию в своих программах для Microsoft
Windows 95 и Microsoft Windows NT 4.0 возможности оболочки, называемой
System Tray.

Часть 1. Комментарий.

Я хочу поблагадорить:
Andy Nicks (2:5031/16.2@Fidonet), Kirill Pushkin (2:5030/219.19),
а так же программистов петербургской фирмы «ПРОМТ», без этих людей
вряд ли я бы написал этот FAQ.

Любые пожелания, поправки, уточнения принимаются !
Распространение — свободное !

19 января 1997 года — Версия 1.1, появились вопросы 11 и 12, исправлен
код в ответе на вопрос 8.
15 января 1997 года — Версия 1.0, впервые написан.

Часть 3. Содержание.
Q1 Что такое System Tray ?
Q2 Как мне перенести свою программу на Tray ?
Q3 Что такое иконка на Tray ?
Q4 Как добавить иконку на Tray ?
Q5 А как ее там изменить ?
Q6 А как удалить иконку с Tray ?
Q7 Как мне узнать о воздействии мыши на иконку, находящуюся на
Tray ?
Q8 Многие программы показывают Pop-Up меню при щелчке на их иконке,
как этого добиться ?
Q9 Многие программы минимизируясь, оказываются на Tray, как это
сделать ?
Q10 Всегда ли все вышесказанное будет работать ?
Q11 А есть ли официальная информация по System Tray ?
Q12 Как сделать пункт «по умолчанию» в Pop-Up меню выделенным ?

Часть 4. Собственно FAQ.
================================================== ====================
Q1: Что такое System Tray ? О чем идет речь ?
A1: Если Вы в операционной ситеме Windows’95 или Windows NT 4.0
пользуетесь оболочкой Explorer, то справа на TaskBar’е Вы
должны были видеть «углубленную» область в которой, обычно,
помещаются часы, переключатель клавиатуры, регулятор громкости и
некоторые другие утилиты. Они изображаются маленькими иконками и
для них существуют ToolTip’ы как для кнопок ToolBar’ов. При
щелчке или двойном щелчке по такой иконке программа обычно
выполняет действие по умолчанию, а при щелчке правой кнопкой
показывает Pop-Up меню.
Hа уровне оболочки System Tray это приложение, поддерживающее
окно, которое вы видите как «углубленную» область и некоторый
сервис для работы с этим окном.
================================================== ====================

Q2: Как мне перенести свою программу на Tray ?
A2: Это типичный вопрос программиста, пишущего какую-нибудь утилиту,
работающую в Background во время всей работы операционной системы
(в DOS такие утилиты делались TSR-программами). Hо вопрос
поставлен не корректно.
Обычно задавае этот вопрос программист имеет в виду примерно
следующее : «Моя программа работает [почти] все время в
минимизированном состоянии и очень жалко места под ее кнопку на
TaskBar’е. Как мне сделать, что бы при минимизации [старте|все
время] моя программа представлялась иконкой на System Tray’е и
отвечала на сообщения мыши от этой иконки ?»
Ответ на этот вопрос состоит из нескольких частей. Смотри
следующие вопросы и ответы на них.
================================================== ====================

Илон Маск рекомендует:  Mk_fp создать дальний указатель

Q3: Что такое иконка на System Tray ?
A3: Ответ на этот вопрос объясняет некорректность вопроса 2. Иконка
на Tray’е это просто картинка, а не окно какой-либо
программы (исследование системы с помощью Microsoft Spy++ for
Windows 95 показывает, что это не окно вообще). System Tray
отслеживает события мыши над иконкой и, в случае надобности,
показывает ToolTip для этой иконки. Так же он отсылает сообщения
о всех действиях мыши над иконкой окну, которое поместило иконку
на Tray.
Таким образом, нельзя поместить программу на Tray. Любая
программа может добавить стоько иконок на Tray, сколько ей
необходимо. При этом главное окно программы не обязано исчезать
или минимизироватся — примером может служить Microsoft Internet
Mail, помещающая иконку «конверт» на Tray в случае появления
новых писем.
================================================== ====================

Q4: Как добавить иконку на Tray ?
A4: Для работы с SystemTray существует всего одна функция. Вот ее
Си-прототип:
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage, // message identifier
PNOTIFYICONDATA pnid // pointer to structure
);
Эта функция описана в заголовочном файле Win32-SDK «shellapi.h»,
включаемом в программу при включении «windows.h». Параметр
dwMessage может принимать одно из трех значений: NIM_ADD,
NIM_DELETE, NIM_MODIFY. Для добавления иконки он должен быть
установлен в NIM_ADD.
Параметр pnid имеет тип PNOTIFYDATA, который описан как:
typedef struct _NOTIFYICONDATA < // nid
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
char szTip[64];
> NOTIFYICONDATA, *PNOTIFYICONDATA;
Поля структуры NOTIFYICONDATA имеют следующий смысл:
cbSize — размер структуры, должен быть
sizeof(NOTIFYICONDATA).
hWnd — дескриптор окна, которое будет получать события
мыши над иконкой.
uID — уникальный идентификатор иконки. Идентификатор
должен быть уникален в пределах окна — обрабо-
тчика, передаваемого в hWnd.
uFlags — битовое поле, определяющее какое из следующих
полей несет действительную информацию.
Может быть одним из следующих значений: NIF_ICON,
NIF_MESSAGE, NIF_TIP или их OR-комбинацией.
uCallbackMessage — сообщение, передаваемое окну — обработчику при
событиях мыши. Желательно получать номер
сообщения вызовом RegisterWindowMessage(),
но допускаются и значения WM_USER+N, где N > 0.
hIcon — дескриптор иконки, помещаемой на Tray.
szTip — текст для ToolTip’а, если szTip[0] = 0x00, то
ToolTip’а не будет.
Таким образом, для добавления иконки на Tray необходимо
заполнить экземпляр структуры NOTIFYICONDATA и вызвать функцию
Shell_NotifyIcon() с параметром NIM_ADD и указателем на
заполненный экземпляр структуры.
При добавлении иконки необходимо заполнить поля cbSize, hWnd,
uID, uFlags, uCallbackMessage, hIcon. Поле szTip можно оставить
пустым, если вам не нужен ToolTip. Поле uFlags должно содержать
как минимум NIF_MESSAGE | NIF_ICON.
================================================== ====================


Q5: Я добавил иконку на Tray, а как ее там изменить ?
A5: После добавления иконки на Tray можно менять саму иконку, ToolTip
и сообщение, посылаемое окну. Для этого необходимо заполнить
экземпляр структуры NOTIFYICONDATA и вызвать функцию
Shell_NotifyIcon() с параметром NIM_MODIFY и указателем
на заполненный экземпляр структуры.
При изменении иконки необходимо заполнить поля cbSize, hWnd,
uID, uFlags и поля, отвечающие за параметры иконки, которые вы
хотите менять. При этом uFlags должен содержать комбинацию
флагов, описывающую поля, которые необходимо менять.
================================================== ====================

Q6: А как удалить иконку с Tray ?
A6: Для удаления иконки вы должны знать ее ID и дескриптор
окна-обработчика сообщений.
Для удаления иконки с Tray надо вызвать функцию
Shell_NotifyIcon() с параметром NIM_DELETE и указателем на
экземпляр структуры NOTIFYICONDATA, у которого должны быть
заполнены следующие поля: cbSize, hWnd, uID.
================================================== ====================

Q7: Как мне узнать о воздействии мыши на иконку, находящуюся на Tray ?
A7: При добавлении иконки на Tray вы указывали окно — обработчик
сообщения и сообщение (CallbackMessage). Теперь окно, указанное
вами будет при любых событиях мыши, происходящих над иконкой
получать сообщение, указанное при добавлении иконки. При этом
параметры lParam и wParam будут задействованы следующим образом:
(UINT)wParam — содержит ID иконки, над которой произошло
событие
(UINT)lParam — содержит стандартное событие мыши, такое
как WM_MOUSEMOVE или WM_LBUTTONDOWN.
При этом, информация о клавишах смены регистра, так же как и
местоположения события, передаваемые при стандартных «настоящих»
сообщениях мыши, теряются.
Hо положение курсора можно узнать функцией GetCursorPos(), а
состояние клавиш смены регистра — функцией GetKeyState(),
описанных в winuser.h.
================================================== ====================

Q8: Многие программы показывают Pop-Up меню при щелчке на их иконке,
помещенной на Tray, как этого добиться ?
A8: Вы должны обрабатывать сообщение, указанное вами при добавлении
иконки на Tray. При значении (UINT)lParam, равном WM_RBUTTONDOWN
(это обычно дял Pop-Up меню по правой кнопке), или любому другому
необходимому вам, вы должны вызовом функции GetCursorPos()
получить позицию курсора в момент события (вряд ли пользователь
успеет убрать мышь за время обработки сообщения, особенно если
он ожидает меню), получить вескриптор Pop-Up меню одним из многих
способов (LoadMenu(), GetSubMenu(), CreateMenu(), и т.д.) и
выполнить следующий код:

SetForegroundWindow(hWnd);
TrackPopupMenuEx(hMenu,TPM_HORIZONTAL|TPM_LEFTALIG N,x, y,hWnd,
NULL);
DestroyMenu(hMenu);
PostMessage(hWnd,WM_USER,0,0);

где hWnd — дескриптор окна, которое будет обрабатывать команду
меню, hMenu — дескриптор меню, x и y — позиция курсора. Для
подробностей смотрите Win32 SDK Help по функции TrackPopupMenuEx.
================================================== ====================

Q9: Многие программы минимизируясь, оказываются на Tray, как это
сделать ?
A9: Hа самом деле, не «программа оказывается на Tray», а только
иконка помещается на Tray, а главное окно программы скрывается.
Для достижения такого результата вам надо обрабатывать сообщение
WM_SIZE, и при значении wParam, равном SIZE_MINIMIZED вы должны
выполнить примерно следующую последовательность действий:
добавить иконку на Tray и скрыть окно — вызвать ShowIndow(hWnd,
SW_HIDE).
Когда произойдет действие, которое должго активировать вашу
программу — WM_LBUTTONDBLCLK или WM_LBUTTONDOWN (или то, что
нравится вам), вы должны удалить иконку и вызвать
ShowWindow(hWnd,SW_SHOW) или ShowWindow(hWnd,SW_SHOWMAXIMIZED).
================================================== ====================

Q10: Всегда ли все вышесказанное будет работать ?
A10: Hет ! Все вышенаписанное работает только при использовании в
операционных системах Windows 95 и Windows NT 4.0 оболочки
Explorer, и при разрешенном System Tray. В случае, если не
происходит запуска systray.exe (запускаетс автоматически
Explorer’ом при старте) или используется другая оболочка
(DashBoard, Program Manager, File Manager), функция
Shell_NotifyIcon() будет возвращать при вызове FALSE и не
выполнять ни каких действий.
Еще раз повторю: System Tray — это возможность оболочки, а не
операционной системы !
================================================== ====================

Q11: А есть ли официальная информация по System Tray ?
A11: Да, есть. Есть маленький пример в Win32 SDK:
SDKRootSamplesWin32Win95TrayNot*.*
Hу и конечно описание в документации функции Shell_NotifyIcon()
и структуры NOTIFYICONDATA.
Так же можно посмотреть Microsoft Knowledge Base:
PSS ID Number: Q128129
PSS ID Number: Q134237
PSS ID Number: Q139408
================================================== ====================

Q12: Как сделать пункт «по умолчанию» в Pop-Up меню выделенным ?
A12: Вообще-то, это вопрос не относящийся к System Tray, а
относящийся к меню. Hо можно ответить и на него.
Устанавливается пункт «по умолчанию» в любом меню функцией API
SetMenuDefaultItem(HMENU hMenu, UINT uItem, UINT fByPos),
подробности — в Win32 SDK документации. Пункт «По умолчанию» не
влияет на работу меню — это чисто интерфейсное выделение пункта
меню полужирным (bold) шрифтом.

Faq system tray а как удалить иконку с tray ?

Как попасть в System Tray? Приходит время, и начинающему Windows-программисту наскучивает открывать и закрывать окно с лозунгом «Hello, World». Его взгляд рассеянно блуждает по «рабочему столу» (не по тому, на котором стоит монитор, а по тому, что создан бессмертной Microsoft) и останавливается на правом нижнем его углу. Та часть панели задач, что привлекла его внимание, именуется «system tray» и содержит значки, которые магическим образом взаимодействуют с программами, работа которых «на первый взгляд как будто не видна» (эти программы нельзя «вызвать» с помощью комбинации [Alt]+[Tab]).

Вышеупомянутого программиста начинает мучить вопрос: а чем его творение хуже Clock, dr.Web, AVP и прочих (посмотрите на свой system tray и продолжите список). Почему бы не растолкать корифеев и не занять свое место под солнцем (точнее, под курсором «мыши») в этом уютном уголке.
В этой статье приводятся сведения, достаточные для того, чтобы любой программист, знакомый с принципами разработки приложений под Windows 9x, мог разместить значок в system tray и управлять им.
Как уже было сказано, system tray — это часть панели задач, которая включает в себя еще меню кнопки «Пуск», кнопки выбора приложения и всплывающее меню. Официальное название system tray — область состояния (status area). Сюда приложения могут размещать значки, которые информируют пользователя об их состоянии или о возникновении событий.
Размещая в этой области значок принтера, приложение сообщает о начале процесса печати. Если курсор «мыши» замрет над каким-нибудь значком, всплывает информационная строка: «паук» dr.Web сообщает о количестве проверенных/инфицированных файлов, «часы» показывают дату, «системный монитор» — количество свободных ресурсов.
Кроме того, значки system tray позволяют организовать обратную связь с пользователем для приложений, окна которых по ряду причин нежелательно размещать на «рабочем столе». Например, чтобы вызвать окно настройки громкости, нужно дважды щелкнуть «мышью» по значку «громкоговорителя». В этом смысле значки выполняют функцию окна приложения: информируют пользователя и принимают сообщения от «мыши».
Для работы со значками в области состояния предназначена всего одна функция WIN32 API — Shell_NotifyIcon. Она описана следующим образом:
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA pnid);

Илон Маск рекомендует:  Моделирование при сжатии текстовых данных контекстуально смешанные модели

При вызове параметр dwMessage должен содержать одно из следующих значений:
— NIM_ADD — добавить значок в область состояния,
— NIM_DEL — удалить значок из области состояния,
— NIM_MODIFY — изменить значок в области состояния.
Параметр pnid указывает на структуру типа NOTIFYICONDATA, значения полей которой зависят от параметра dwMessage.
Функция Shell_NotifyIcon возвращает ненулевое значение, если операция прошла успешно, и ноль в случае ошибки.
Рассмотрим подробнее структуру NOTIFYICONDATA. Она описана следующим образом:
typedef struct _NOTIFYICONDATA <
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
char szTip[64];
> NOTIFYICONDATA, *PNOTIFYICONDATA;
и ее поля имеют следующий смысл:
— cbSize — размер структуры NOTIFYICONDATA,
— hWnd — манипулятор окна, которое будет получать сообщения от значка в области состояния;
— uID — идентификатор значка. Это значение передается приложению в качестве первого параметра (WPARAM) сообщения от значка;
— uFlags — набор флагов, которые определяют, какие поля структуры заданы корректно. Могут использоваться следующие значения или их комбинации с помощью логического «ИЛИ»: NIF_ICON — поле hIcon корректно, NIF_MESSAGE — поле uCallbackMessage корректно, NIF_TIP — поле szTip корректно;
— uCallbackMessage — идентификатор сообщения, посылаемого окну hWnd при возникновении события «мыши» над значком в области состояния. Можно использовать значения WM_USER+N, где N — неотрицательное число;
— hIcon — манипулятор иконки, которую нужно разместить (изменить, удалить) в system tray;
— szTip — ASCIIZ-строка, которая будет использоваться в качестве «всплывающего» текста, когда указатель «мыши» остановится над значком. Если текст отсутствует, первый байт строки должен быть нулевым.
Перед вызовом функции Shell_NotifyIcon нужно подготовить экземпляр структуры NOTIFYICONDATA. Поля cbSize, hWnd и uID нужно заполнять всегда, остальные — по мере необходимости. В соответствии с заполнением полей uCallbackMessage, hIcon и szTip формируется поле флагов uFlags.
Чтобы добавить значок в область состояния, нужно вызвать функцию Shell_NotifyIcon, передав ей в качестве параметра dwMessage значение NIM_ADD, а в качестве pnid — указатель на инициализированный экземпляр структуры NOTIFYICONDATA. Если все выполнено правильно, функция вернет ненулевое значение, а в system tray появится новая иконка. Если планируется, что окно должно принимать сообщения от значка, следует обратить внимание, чтобы поле hWnd перед вызовом Shell_NotifyIcon было инициализировано значением манипулятора реально существующего окна. В противном случае значок будет исчезать из области состояния, как только над ним остановится указатель «мыши». Если было инициализировано поле uCallbackMessage, система будет посылать окну hWnd сообщения о событиях «мыши» над значком. При этом параметр сообщения WPARAM будет содержать идентификатор значка uID, а параметр LPARAM — тип сообщения.
Приложение, разместившее значок в system tray, может в любой момент изменить иконку или всплывающую подсказку. Для этого нужно внести изменения в соответствующие поля структуры NOTIFYICONDATA, поправить значение uFlags (значения cbSize, hWnd и uId изменяться не должны!) и вызвать функцию Shell_NotifyIcon со значением NIM_MODIFY в качестве параметра dwMessage.
Для удаления значка из system tray достаточно правильно заполнить поля cbSize, hWnd, u >Приведенные сведения позволяют программисту жонглировать значками в system tray как только он пожелает. Дополнительную информацию и примеры использования функции Shell_NotifyIcon и обработки сообщений «мыши» можно найти в «Win32 Programmer’s Reference», что поставляется в виде help-файла «Win32 online help» в составе Borland C++ 5.0.
Но если Вы программируете не на Ассемблере, а, к примеру, на C++, можно построить элегантный класс, который позволит еще больше упростить процесс работы со значками в области состояния.
Итак, за работу. Назовем наш класс SystemTrayIcon. Он должен содержать сведения о значке в области состояния и методы работы с ним. То есть он должен знать, как создать, модифицировать и удалить значок. Кроме того, в нем должна быть информация о том, размещен ли значок в system tray или еще нет.
Вся информация о значке содержится в структуре NOTIFYICONDATA, поэтому ее экземпляр можно поместить в класс, а чтобы защитить его от несанкционированного использования — ограничим доступ модификатором private. Туда же поместим логическую переменную fIsPlaced, которая будет принимать значение TRUE, если иконка размещена в system tray, и FALSE — в противном случае. Наш класс будет содержать следующие методы: конструктор (ну как же без него?), FAdd (размещает значок в system tray), FChangeIcon (изменяет иконку), FChangeTip (изменяет всплывающую подсказку), FDelete (удаляет значок из system tray) и деструктор. Запишем то, о чем сказано, в терминах C++:

Что же у нас получилось? Для размещения значка в system tray нужно прежде всего создать объект класса SystemTrayIcon. Конструктор инициализирует класс и присваивает члену fIsPlaced значение FALSE, что соответствует отсутствию значка в system tray. Для добавления значка в область состояния нужно воспользоваться методом FAdd, передав ему в качестве параметров все необходимые сведения о значке (эти параметры соответствуют аналогичным параметрам функции Shell_NotifyIcon, поэтому здесь не расписываются). Этот метод, как и методы FChangeIcon, FChangeTip, FDelete, возвращает TRUE в случае удачи и FALSE — в противном случае. Реализация методов выглядит следующим образом:

Чтобы изменить иконку, просто обращаемся к методу FChangeIcon с манипулятором новой иконки в качестве параметра. Все необходимые значения в классе уже сохранены. Аналогичным образом с помощью метода FChangeTip изменяется всплывающая подсказка. Удалить значок из system tray можно с помощью метода FDelete или просто уничтожив объект класса SystemTrayIcon (тогда деструктор сделает это автоматически).
Преимущества объектно-ориентированного подхода налицо. Ничто не мешает создать несколько объектов класса SystemTrayIcon и разместить в области состояния несколько значков. При дальнейшей работе с объектами нет необходимости задумываться над тем, какие поля инициализировать для изменения параметров значка или его удаления, нужно просто воспользоваться готовым методом. Удаление значков из system tray может выполняться автоматически при уничтожении соответствующего объекта.
Теперь можно подвести итоги. В статье рассмотрен способ размещения, удаления и работы со значками в system tray. Приведено описание функции Shell_NotifyIcon WIN32 API и объяснены ее параметры. В качестве примера построен С++ класс SystemTrayIcon, позволяющий упростить операции со значками в области состояния, и приведены реализации его методов. Надеюсь, что эта статья поможет кому-нибудь реализовать свои идеи в профессиональном воплощении и вдохновит на новые подвиги в области программирования под Windows. А ведь начиналось все с «Hello, World»!

Игорь Орещенков

Системный трей

Трей – это область уведомлений на панели задач, в нижнем правом углу экрана. В нем находятся системные значки (часы, громкость и т. д.) и иконки программ.

Что такое трей


Системный трей – это часть панели задач Windows. Находится в правом нижнем углу экрана.

Здесь размещены системные значки и иконки программ. Некоторые из них могут скрываться под кнопкой со стрелкой.

К системным относятся:

  • Часы
  • Звук
  • Сеть
  • Электропитание
  • Раскладка клавиатуры
  • Системные события

Программные иконки показывают программы компьютера, которые запущены в данный момент.

Официально эта часть панели задач называется область уведомлений (Notification Area). Системный трей – это ее неофициальное название, хотя оно иногда используется [1] в документации Microsoft.

Системные значки

Часы . Здесь показывается время и дата, которую компьютер считает актуальной. Для открытия полной информации (время с секундами, день недели, календарь) просто нажмите на этот значок.

Звук . Данная иконка позволяет регулировать общую громкость на компьютере или звуки отдельных программ.

Для изменения громкости щелкните по иконке и перемесить ползунок с помощью зажатой левой кнопки мыши или колеса прокрутки.

Сеть . Показывает подключение к Интернету. Если доступ к сети беспроводной (wi-fi), иконка будет такой , а если другое подключение (через кабель, 3G модем), то такой .

При нажатии на значок откроется информация по текущему подключению, а также доступные точки wi-fi. Здесь можно быстро отключиться/подключиться, а также перейти в настройки.

Электропитание . Этот значок будет только у ноутбуков. Когда зарядное устройство подключено, он выглядит так . Когда отключено, так — . Белый цвет в данном случае отображает состояние заряда батареи.

При наведении курсора на иконку всплывает сообщение о заряде, а нажав на нее можно выбрать режим расхода энергии и получить доступ к более продвинутым настройкам.

Раскладка клавиатуры . Отображает установленный в данный момент язык ввода. Его можно поменять вручную или при помощи комбинации клавиш (обычно Shift + Alt или Shift + Ctrl).

Для удаления алфавита или добавления нового щелкните по раскладке клавиатуры правой кнопкой мыши и выберите «Параметры…». В Windows 10: левой кнопкой мыши → Настройки языка.

Илон Маск рекомендует:  Перечень сообщений об ошибках в результатах сканирования генератора карты сайта

Системные события . Иконки, которые уведомляют пользователя о событиях Windows, указывают состояние операции и дают к ней быстрый доступ. Это такие значки как:

  • – безопасное извлечение устройства;
  • – очередь печати;
  • – установка нового оборудования;
  • и другие.


Настроить функцию, за которую отвечает тот или иной значок, можно щелкнув по нему правой кнопкой мыши и выбрав соответствующий пункт меню.

Иконки программ

В области уведомлений вместе с системными значками находятся иконки программ. Обычно это программы, которые работают в фоновом режиме.

Любую из них можно вызвать из трея, настроить, отключить.

Каждая такая программа активна, а это значит, она забирает часть оперативной памяти. Это допустимо, если приложение часто используется или необходимо для безопасности, корректной работы системы и устройств. Например, антивирус, мессенджеры (скайп, вайбер).

Но часто в трее находятся программы, которые используются редко или не используются вообще. Помимо того, что они занимают место на панели задач, так еще и забирают оперативную память. Из-за этого слабые компьютеры работают медленнее, чем могли бы.

Как убрать программу из трея

Есть три варианта очистки трея:

  1. Скрытие значка . Программа будет по-прежнему работать в фоновом режиме, но иконки в области уведомлений не будет.
  2. Выход из программы . Работа программы завершится. Но если ее запуск прописан в автозагрузке, то при следующем включении компьютера она снова начнет работать в фоне.
  3. Удаление из автозагрузки . Программа перестанет автоматически запускаться при включении компьютера. При этом она по-прежнему останется в системе, и ее в любой момент можно будет вызвать.

Скрытие значка

Для скрытия достаточно перетащить иконку в отдел скрытых значков (под стрелку). Для этого схватиться за иконку левой кнопкой мыши, подвести к стрелке и отпустить в нужном месте окна.

Или можно скрыть иконку через свойства: правой кнопкой мыши по панели задач → Свойства (Параметры) → Настроить.

При скрытии значка программа продолжит работать в фоновом режиме.

Выход из программы

Для выхода из программы щелкаем по ее значку правой кнопкой мыши и выбираем соответствующий пункт меню. Он может называться Выход, Закрыть, Отключить, Exit, Close и т. п.

Программа закроется, но только на текущий сеанс работы. Если она находится в автозагрузке, то при следующем включении компьютера снова будет работать в фоне.

Удаление из автозагрузки


Автозагрузка – это функция системы, которая управляет автоматическим запуском программ при загрузке Windows.

Как убрать программу из автозагрузки:

1 . В строке поиска вводим msconfig и открываем найденный файл.

2 . Переходим во вкладку «Автозагрузка» и отключаем программы, которые нужно удалить из автозапуска. Применяем изменения и перезагружаем компьютер.

После удаления программы из автозагрузки она перестанет автоматически запускаться вместе с включением компьютера.

System Tray что это и можно ли удалить из автозагрузки?

System Tray — область уведомлений. Находиться обычно справа внизу на панели задач — там где часы. Предназначен для уведомления пользователя о состоянии некоторых функций системы или стороннего ПО (нпр. состояния подключения к сети) и/или быстрого доступа к этим функциям (нпр. регулировка звука).

Убрать сам System Tray невозможно — это часть системы. Можно убрать/выключить отображение значков. Слышал, что через реестр убрать можно практически все, включая часы. Но сам не пробовал. Какие-то отдельные значки можно убрать в настройках соответствующих функций в настройках системы или стороннего ПО — при этом значки не выводятся в Tray вообще. Или в настройках самого System Tray — при этом отключается только отображения значка на экране.

Как удалить значки приложений в системном трее Ubuntu 18 GNOME

Возможно, дубликат, но я ничего не мог найти.

Как удалить приложения в правом верхнем углу (Google Chrome, flux, TeamViewer)

До моего обновления от Ubuntu GNOME 16 это было еще более раздражающим в левом нижнем углу.

2 ответа

Эти значки предоставляются с помощью расширения оболочки GNOME называется » Ubuntu appindicators » (имя пакета: gnome-shell-extension-appindicator ). Поскольку это системное расширение, может быть нелегко просто отключить его с помощью GNOME Tweaks или здесь .

Удаление этого расширения должно избавиться от этих значков , но оно вообще не рекомендуется , так как оно также удалит мета-пакет ubuntu-desktop , который может сломать вещи. Вместо этого попробуйте исправления, упомянутые ниже.

1. Hackish solution

Вы можете использовать еще один расширение под названием » Icon Hider «для достижения вашей цели. Это расширение позволяет вам переключать видимость отдельных значков в верхней панели.

После установки и активации расширения откройте его настройки. Вы должны найти записи, соответствующие тем значкам, которые вы хотите скрыть в нижней части (например, на скриншоте ниже. У меня есть записи, соответствующие приложениям «Skype» и «Будильник»). Просто отключите их.
(Возможно, вам придется повторно зарегистрироваться, чтобы увидеть эффект.)

2. Чистое решение


Возможно, лучшим решением является использование ванили GNOME (оболочка GNOME без изменений, сделанная Ubuntu). Поскольку GNOME избавился от старого лотка (старого раздражающего лотка в нижнем левом углу) от версии 3.26, эти значки в верхней панели отключены по умолчанию.

Вы можете установить vanilla GNOME, запустив

Как только он будет установлен, перезагрузите (или повторно войдите в систему). Как только вы перейдете на экран входа в GDM, вы должны найти шестерню (⚙️) рядом с кнопкой входа. Если вы нажмете на шестерню, вы должны найти опции под названием » GNOME » и » GNOME on Wayland » вместе с Ubuntu и Ubuntu on Wayland . Выберите опцию GNOME вместо Ubuntu .

Qt/C++ — Урок 002. QSystemTrayIcon или Как свернуть приложение в трей?

Аналогичная статья на PyQt5/Python

Сегодня обсудим то, каким образом сворачивать приложение, написанное на фреймворке Qt, в трей операционной системы с помощью класса QSystemTrayIcon. Данная функция является весьма полезной для приложений, которые должны выполняться в фоновом режиме длительное время. Например, приложение видеозаписи или аудио воспроизведения.

Поэтому займёмся следующими вопросами:

  • Как научить Вашу программу сворачиваться в трей;
  • Как сделать контектсное меню для иконки трея Вашего приложения;
  • Как отключать данную функцию, если в ней нет необходимости.

Программный код был написан в QtCreator 3.3.1 на основе Qt 5.4.1.

Структура проекта для QSystemTrayIcon

Проект создается как Приложение Qt Widgets, в котором по умолчанию создаются файлы:

  • Tray.pro — профайл;
  • mainwindow.h — заголовочный файл основного окна приложения;
  • mainwindow.cpp — исходный код окна;
  • main.cpp — основной исходный файл, с которого стартует приложение;
  • mainwindow.ui — формочка основного окна приложения.

Примечание. Большую часть интерфейса создаю в дизайнере, чтобы не загромождать логику основного кода лишней информацией. По сути это лишь дело вкуса и привычки.

mainwindow.ui

Для теста создадим простую и ничем не примечательную формочку с чек-боксом.

Название объекта QCheckBox следующее — trayCheckBox

Tray.pro


Данный файл оставляем с настройками по умолчанию.

main.cpp

Данный файл также не подвергается изменениям

mainwindow.h

В заголовочном файле уже вносятся изменения, поскольку нам необходимо отслеживать событие закрытия окна, а также необходимо создать обработчик нажатий на иконку приложения в трее. Также в данном файле не забываем подключить все необходимые библиотеки. Иначе проект не скомпилируется.

mainwindow.cpp

Вся логика работы тестируемого приложения заложена в данном классе. Приложение будет сворачиваться в трей только в том случае, если галочкой отмечен чекбокс. Вместо чекбокса может выступать переменная или любой другой способ хранения информации о необходимости работы данной функции.

При этом, чтобы выйти из приложения при отмеченном чекбоксе, используется соответствующий пункт в контекстном меню.

Также, когда приложение сворачивает в трей, то всплывает соответствующее сообщение, которое информирует пользователя о данном событии.

В случае успешной сборки проекта, Ваше приложение с легкостью свернётся в трей колачиком. Пример работы приложения с QSystemTrayIcon показан на следующем видео:

Можно ли вращать одну иконку в system tray?

Находил только варианты проанимировать иконку в трее лишь с помощью использования нескольких иконок, каждая из которых будет являться одним из кадров анимации. К примеру, как здесь.

Интересует тот же результат, только с использование одной иконки. На эту тему нашёл лишь пример на C++.

Как сделать нечто такое на C#?

2 ответа 2

Как по-твоему, сколько иконок будет, если анимацию не делать? Убираешь из примера с анимацией лишние иконки и таймер и получается именно то, о чём ты спрашиваешь.

Мне анимация нужна в виде движения по кругу.

Значит складываешь в массив повёрнутые на разный угол иконки и последовательно их меняешь как в той анимации. Можно либо заранее заготовить набор повёрнутых иконок, либо поворачивать их программно (например, так).

На случай если ещё кому-то понадобится вращать одну иконку в области уведомлений (system tray), вот готовая реализация. Пришёл к ней благодаря ссылке выше от Qwertiy и небольшому гуглению. Некоторая проблема в коде состоит лишь в том, что со временем он пожирает оперативную память. Для system tray icon это незначительно, но если с помощью этого кода вращать более увесистые изображения, то потеря памяти будет заметней. Я не знаю насколько это нормально и можно ли предотвратить.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL