Трей – это область уведомлений на панели задач, в нижнем правом углу экрана. В нем находятся системные значки (часы, громкость и т. д.) и иконки программ.
Что такое трей
Системный трей – это часть панели задач Windows. Находится в правом нижнем углу экрана.
Здесь размещены системные значки и иконки программ. Некоторые из них могут скрываться под кнопкой со стрелкой.
К системным относятся:
Часы
Звук
Сеть
Электропитание
Раскладка клавиатуры
Системные события
Программные иконки показывают программы компьютера, которые запущены в данный момент.
Официально эта часть панели задач называется область уведомлений (Notification Area). Системный трей – это ее неофициальное название, хотя оно иногда используется [1] в документации Microsoft.
Системные значки
Часы . Здесь показывается время и дата, которую компьютер считает актуальной. Для открытия полной информации (время с секундами, день недели, календарь) просто нажмите на этот значок.
Звук . Данная иконка позволяет регулировать общую громкость на компьютере или звуки отдельных программ.
Для изменения громкости щелкните по иконке и перемесить ползунок с помощью зажатой левой кнопки мыши или колеса прокрутки.
Сеть . Показывает подключение к Интернету. Если доступ к сети беспроводной (wi-fi), иконка будет такой , а если другое подключение (через кабель, 3G модем), то такой .
При нажатии на значок откроется информация по текущему подключению, а также доступные точки wi-fi. Здесь можно быстро отключиться/подключиться, а также перейти в настройки.
Электропитание . Этот значок будет только у ноутбуков. Когда зарядное устройство подключено, он выглядит так . Когда отключено, так — . Белый цвет в данном случае отображает состояние заряда батареи.
При наведении курсора на иконку всплывает сообщение о заряде, а нажав на нее можно выбрать режим расхода энергии и получить доступ к более продвинутым настройкам.
Раскладка клавиатуры . Отображает установленный в данный момент язык ввода. Его можно поменять вручную или при помощи комбинации клавиш (обычно Shift + Alt или Shift + Ctrl).
Для удаления алфавита или добавления нового щелкните по раскладке клавиатуры правой кнопкой мыши и выберите «Параметры…». В Windows 10: левой кнопкой мыши → Настройки языка.
Системные события . Иконки, которые уведомляют пользователя о событиях Windows, указывают состояние операции и дают к ней быстрый доступ. Это такие значки как:
– безопасное извлечение устройства;
– очередь печати;
– установка нового оборудования;
и другие.
Настроить функцию, за которую отвечает тот или иной значок, можно щелкнув по нему правой кнопкой мыши и выбрав соответствующий пункт меню.
Иконки программ
В области уведомлений вместе с системными значками находятся иконки программ. Обычно это программы, которые работают в фоновом режиме.
Любую из них можно вызвать из трея, настроить, отключить.
Каждая такая программа активна, а это значит, она забирает часть оперативной памяти. Это допустимо, если приложение часто используется или необходимо для безопасности, корректной работы системы и устройств. Например, антивирус, мессенджеры (скайп, вайбер).
Но часто в трее находятся программы, которые используются редко или не используются вообще. Помимо того, что они занимают место на панели задач, так еще и забирают оперативную память. Из-за этого слабые компьютеры работают медленнее, чем могли бы.
Как убрать программу из трея
Есть три варианта очистки трея:
Скрытие значка . Программа будет по-прежнему работать в фоновом режиме, но иконки в области уведомлений не будет.
Выход из программы . Работа программы завершится. Но если ее запуск прописан в автозагрузке, то при следующем включении компьютера она снова начнет работать в фоне.
Удаление из автозагрузки . Программа перестанет автоматически запускаться при включении компьютера. При этом она по-прежнему останется в системе, и ее в любой момент можно будет вызвать.
Для скрытия достаточно перетащить иконку в отдел скрытых значков (под стрелку). Для этого схватиться за иконку левой кнопкой мыши, подвести к стрелке и отпустить в нужном месте окна.
Или можно скрыть иконку через свойства: правой кнопкой мыши по панели задач → Свойства (Параметры) → Настроить.
При скрытии значка программа продолжит работать в фоновом режиме.
Выход из программы
Для выхода из программы щелкаем по ее значку правой кнопкой мыши и выбираем соответствующий пункт меню. Он может называться Выход, Закрыть, Отключить, Exit, Close и т. п.
Программа закроется, но только на текущий сеанс работы. Если она находится в автозагрузке, то при следующем включении компьютера снова будет работать в фоне.
Удаление из автозагрузки
Автозагрузка – это функция системы, которая управляет автоматическим запуском программ при загрузке Windows.
Как убрать программу из автозагрузки:
1 . В строке поиска вводим msconfig и открываем найденный файл.
2 . Переходим во вкладку «Автозагрузка» и отключаем программы, которые нужно удалить из автозапуска. Применяем изменения и перезагружаем компьютер.
После удаления программы из автозагрузки она перестанет автоматически запускаться вместе с включением компьютера.
Иконки в «System Tray»
Практические ответы.
Автор: Nickolay Merkin The RSDN Group
Опубликовано: 04.04.2002 Исправлено: 15.04.2009 Версия текста: 1.1.1
Предисловие
Эта статья была задумана как ответы на многочисленные вопросы об иконках в System Tray (далее — трей):
Как показать/изменить иконку (см. раздел «API»)
Как вывести контекстное меню (см. раздел «Обработка событий»)
В результате тестовая программа выросла в библиотеку, упрощающую работу с иконками.
API для работы с иконками.
Здесь описана функциональность, общая для всех версий Windows (начиная с Win2000, появились дополнения — версия 5 библиотеки shellapi).
Описание
Shell_NotifyIcon
Для того, чтобы показать иконку в трее, используется функция Shell_NotifyIcon
Первый параметр ( dwMessage )
NIM_ADD – добавить иконку в трей
NIM_DELETE – убрать
NIM_MODIFY – обновить
В версии 5 появились еще две команды:
NIM_SETFOCUS – установить фокус для ручного ввода на данную иконку
NIM_SETVERSION – установить версию (включить режим совместимости с Win95)
Второй параметр – ссылка на структуру NOTIFYICONDATA
Структура NOTIFYICONDATA
Первое поле – cbSize – служит для передачи размера структуры, как это принято в WinAPI:
Следующие поля – hWnd и uID – служат для идентификации иконки. Причем hWnd соответствует окну приложения (как правило, главному), а uID может быть произвольным и служит для различения иконок. Если включено сообщение для нотификации (uCallbackMessage, см. ниже), то оно будет посылаться этому окну.
Поле uFlags показывает, какие именно из остальных полей содержат информацию (комбинация битовых флагов):
NIF_ICON – иконка
NIF_MESSAGE – оконное сообщение
NIF_TIP – подсказка (tool tip)
NIF_STATE – состояние (начиная с версии 5)
NIF_INFO – расширенная подсказка (tool tip), которая появляется в «воздушном шарике» (balloon)
NIF_GUID – зарезервировано для версии 6.
Поле uCallbackMessage – номер оконного сообщения, которое будет посылаться окну hWnd при событиях от мышки и клавиатуры. (Подробнее об этом – в разделе «обработка событий»).
Поле hIcon – хэндл иконки.
СОВЕТ
В трее показываются иконки размером 16*16.
Ресурс иконки может включать несколько изображений разных размеров. Позаботьтесь добавить изображение 16*16 в ваш ресурс.
Поле szTip – строка подсказки размером до 64 (в версии 5 – до 128) символов.
ПРЕДУПРЕЖДЕНИЕ
Строка подсказки имеет тип TCHAR[], поэтому для работы с ней нужно использовать переносимые функции, а главное, правильно указывать размер в символах, а не байтах: sizeof(nid.szTip) / sizeof(nid.szTip[0])
Поля dwState и dwStateMask – управляют состоянием иконки (битовые флаги):
NIS_HIDDEN – скрыть иконку
NIS_SHARED – сделать иконку разделяемой ( кстати, кто знает, что бы это значило? )
Поля szInfo и szInfoTitle – большая подсказка в «воздушном шарике» (balloon). Аналогичны szTip.
Поле dwInfoFlags – стиль «воздушного шарика». Принимает одно из значений:
Поле uTimeout устанавливает задержку (в миллисекундах) для вывода «воздушного шарика». Допустимый диапазон – от 10.000 до 30.000 миллисекунд.
Поле uVersion служит для эмуляции функциональности предыдущих версий Shell. Оно принимает значения
0 – Windows 95
NOTIFYICON_VERSION – текущая версия (начиная с Windows 2000).
ПРИМЕЧАНИЕ
Обратите внимание, что uTimeout и uVersion конкурируют. uVersion используется только при вызове Shell_NotifyIcon с параметром NIM_SETVERSION.
Поле guidItem зарезервировано для версии 6.
Применение
Добавление иконки
В дальнейшем, при удалении или изменении, не забудьте удалить hIcon (см. ниже).
Остальные поля заполняются по мере необходимости.
Полем uFlags указываем, какие поля заполнены:
Удаление иконки
Инициализируем структуру, указав uID ранее созданной иконки, вызываем функцию:
Если окно закрыть, не удалив иконку вручную, то она остается жить до первого обращения (наведения мышки).
Если объект иконки более не нужен, уничтожим его:
Изменение иконки
Инициализируем структуру, устанавливая те поля, которые хотим изменить.
Можно менять изображение (как это делает The Bat!, машущий крыльями), текст подсказки (удаленное соединение – пишет, сколько байт передано), оконное сообщение (как правило, его устанавливают один раз при добавлении; в принципе, так можно включать/выключать обработку событий).
Устанавливаем соответствующие флаги uFlags.
Обработка событий
Трей ловит события от мыши (начиная с версии 5, от клавиатуры: вызов контекстного меню) и посылает их в окно с помощью PostMessage(hWnd, uCallbackMessage, (WPARAM)uID, (LPARAM)uMsg). То есть, если навести мышь на иконку, то WM_MOUSEMOVE будет передано вторым параметром (LPARAM).
ПРИМЕЧАНИЕ
Сопровождающая информация (координаты, состояния кнопок) не посылается и должна быть извлечена соответствующими функциями WinAPI (GetCursorPos).
Приложение может выбрать любой код для сообщения (uCallbackMessage), как правило, это или число WM_USER + …, WM_APP + …, либо зарегистрированное в системе с помощью RegisterWindowMessage().
Простой обработчик сообщений
Контекстное меню принято показывать в ответ на щелчок правой кнопкой, то есть на WM_RBUTTONDOWN — WM_RBUTTONUP.
Здесь есть тонкость: пользователь может нажать кнопку на иконке, затем увести мышь, отпустить кнопку, . потом снова нажать, вернуть мышь, отпустить. Для иконки это будет выглядеть как медленный щелчок или небольшой драг-н-дроп. Обычный для других случаев выход из положения – захват мыши (::SetCapture) неприменим, поэтому все действия производятся по «переднему фронту»: WM_xBUTTONDOWN (одинарный щелчок), WM_xBUTTONDBLCLK (двойной щелчок).
Спецэффекты
Как показать контекстное меню
Делается это так же, как и в любом другом случае. Единственное отличие – в том, что координаты мыши не переданы в составе сообщения, и их придется брать напрямую.
Если не вызвать SetForegroundWindow(hWnd), то меню не сможет автоматически закрытся по щелчку мыши за его пределами.
Как видите, ничего сложного нет.
Комментария требует только GetSubMenu().
В ресурсе хранятся «полосы меню» (menu bars), предназначенные для встраивания в окна. Если его показать функцией TrackPopupMenu, то мы увидим узкую вертикальную полоску без текста.
Поэтому нужно либо создавать «всплывающее меню» (popup menu) функцией CreatePopupMenu(), либо брать подменю (которое по определению является «всплывающим»). Соответственно, ресурс этого меню выглядит как полоса с одним элементом (номер 0), в подменю которого сложена вся функциональность.
Как свернуть окно в трей
Перефразируем задачу: как спрятать окно, убрав его кнопку с панели задач и показать иконку в трее?
СОВЕТ
Вы можете воспользоваться программой TrayIt (http://www.teamcti.com/TrayIt), которая умеет сворачивать в трей окна любых приложений.
Спрятать окно можно, вызвав ShowWindow сперва с параметром SW_MINIMIZE, а затем — SW_HIDE.
Восстановить — SW_SHOW (при этом оно появится в панели задач), а затем — SW_RESTORE (восстановить из свернутого состояния).
Когда пользователь командует «свернуть» (нажатие кнопки на заголовке окна, двойной щелчок по кнопке в панели задач, пункт системного меню), посылается сообщение WM_SIZE с параметром SIZE_MINIMIZED. Обработчик этого события может свернуть окно в трей.
Ниже приведен код на WinAPI. Перенос его на MFC или WTL — упражнение для читателя.
Обертки для иконки
Задача оберткок — упростить работу с иконкой. Какую функциональность они могут взять на себя?
Во-первых, автоматизировать вызовы API
Заполнение структуры NOTIFYICONDATA
Прослойка для вызовов API
Обновление иконки при изменении ее параметров
Загрузка иконок из ресурсов
Во-вторых, избавление пользователя от необходимости прикреплять иконку к пользовательским окнам:
Создание общего (скрытого) окна-носителя
Централизованная регистрация иконок
В третьих, упрощение обработки событий
Централизованная регистрация обработчиков событий от иконок
Простой и гибкий синтаксис обработки
Наконец, автоматизация типовых действий
Показ контекстного меню
Сворачивание окна в трей
Пример такой обертки — библиотека ShellIcons (написанная мной).
Библиотека ShellIcons
ShellIcons написана на Visual C++ с без использования MFC и с минимальным использованием STL. Впрочем, из-за простоты ее легко перенести на любую технологию.
См. также http://www.rsdn.ru//article/files/Classes/ni.xml — класс CNotifyIcon от Игоря Вартанова, аналогичный CShellIcon.
CExtShellIconHost — прототип носителя иконок, абстрагированный от окна
CWinShellIconHost — носитель иконок на окне, созданном средствами чистого WinAPI
_ShellIconNote — интерфейс обработчика событий
CShellIconNote — простая реализация обработчика с виртуальными методами «на все случаи жизни»
ПРИМЕЧАНИЕ
Абстрагирование носителя от окна было сделано, потому что «песочница» использовала MFC, и первая реализация носителя была MFC-шная.
CShellIcon
В чистом виде обертка структуры NOTIFYICONDATA.
Отличительная черта («фича») этого класса — способность отслеживать и моментально применять изменения свойств иконки, а также автоматически удалять ее из панели.
Кроме того, он автоматически уничтожает хэндл иконки (hIcon) при изменении (setIcon(), loadIcon() ) и в деструкторе.
Использование очень простое:
Создать объект CShellIcon
Передать ему все необходимые свойства иконки (обязательно — хэндл окна, идентификатор и хэндл иконки)
Время жизни иконки в трее ограничено временем жизни объекта (и, естественно, окна).
CExtShellIcon наследует CShellIcon в защищенном режиме: базовый класс обладает избыточной функциональностью, ставящей под угрозу целостность системы (хэндл окна и сообщение нотификации поставляются исключительно носителем и не могут быть произвольно заменены).
CExtShellIconHost содержит коллекцию объектов CExtShellIcon.
ПРЕДУПРЕЖДЕНИЕ
Использование STL напрямую приводит к туче предупреждений компилятора VC++ (классы STL не объявлены как экспортируемые) и способно привести к ошибкам выделения памяти со статической библиотекой C RunTime.
С другой стороны, использование абстрактной коллекции (интерфейс которой см. ниже) делает код более громоздким.
Реализация коллекции уже использует STL, но скрывает ее от клиента.
Реализация носителя: CWinShellIconHost
Объект создает невидимое окно, которое поддерживает иконки (предоставляет хэндл окна, обрабатывает события).
Теоретически, можно создать сколько угодно носителей, но на практике удобно иметь один, т.е. синглетон.
Обработка событий
Как видно выше, пользователь может указать иконке либо функцию (PFNShellIconNote), либо интерфейс объекта-обработчика (_ShellIconNote). Приоритет отдается объектам.
В функцию (или метод) обработчика передается ссылка на носитель и на иконку, от которой пришло событие, а также код сообщения (uMsg) — WM_MOUSEMOVE и тому подобное.
Для того, чтобы не писать switch(uMsg), существует простая реализация класса-обработчика:
Он анализирует код сообщения и вызывает соответствующий метод.
Таким образом, для обработки, скажем, щелчка правой кнопкой (вызов контекстного меню) достаточно перекрыть единственный метод onTrayRightButtonDown().
Утилиты
Объект CTrackMenu позволяет загрузить несколько меню, правильным способом их показать, и разрушить по перезаписи или удалению объекта.
CHideWindow умеет сворачивать окно в трей и восстанавливать его оттуда. Сворачивание — по инициативе клиента (окно перехватывает событие минимизации). Разворачивание — по двойному щелчку на иконке.
Иконка и текст подсказки берутся из окна. Если заголовок окна поменялся, достаточно вызвать метод update() для обновления иконки в трее.
Объект использует носитель иконок CWinShellIconHost, что позволило, во-первых, динамически выделять номера иконок, а во-вторых, не принуждать клиентов самостоятельно обрабатывать события нотификации.
Пример использования. Диалог с иконкой в трее.
Это простое MFC-приложение, демонстрирующее все приемы, описанные выше.
Добавление и модификация иконок
Обработка событий
Вывод контекстных меню
Сворачивание в трей
Локальные (CShellIcon) и централизованные (CWinShellIconHost) иконки