Введение
Появление новых программ, которые открывают интересные возможности, всегда
ставит много вопросов перед разработчиками. А уж появление новых интерфейсов,
API для разработки приложений - тем более. Виной тому наша инерционность мышления,
которая не всегда дает объективно воспринимать новое и непонятное. Наверное поэтому
появление проекта SysTray/2, а вместе
с ним и нового API System Tray поставило много вопросов по использованию
системного трея в программах для PM, и необходимости в таком API.
Необходимость такого API назрела, что наглядно демонстрируют результаты
уже довольно давнего опроса по этой теме на нашем сайте. И вот уже почти два года
существует и развивается проект SysTray/2 вместе со своим подможеством
API для работы с системным треем. В этой статье мы попробует выяснить
основные аспекты его использования.
Использование
Изнутри System Tray API выглядит весьма просто: программа-клиент и программа-сервер
системного трея (в случае с SysTray/WPS - отдельный демон systrayd.exe)
обмениваются сообщениями. Программа-сервер периодически проверяет окно
программы-клиента на валидность, и в противном случает удаляет его из системного трея,
прибивая таким образом окна-зомби трапнувшихся программ.
Для установления соединения с сервером используется самый мягкий и простой
способ для PM - DDE. С помощью WinDdeInitiate программа-клиент
инициирует DDE-сессию, где в качестве приложения выступает "SystrayServer",
а в качестве топика "TRAY". Получив WM_DDE_INITIATE, программа-сервер
системного трея выполняет WinDdeRespond, таким образом открывая
DDE-сессию. После чего клиент получает WM_DDE_INITIATE_ACK,
где в mp1 будет дескриптор окна программы-сервера. Получив этот дескриптор,
программа-клиент немедленно закрывает DDE-сессию. Все дальнейшие действия
программа-клиент будет производить с окном-сервером.
Получив окно-сервер (что сигнализирует об удачном соединении с программой-сервером,
системного трея), программа клиент может немедленно добавить свою иконку в
системный трей, вызвав функцию AddTrayIcon библиотеки поддержки
системного трея, входящей в состав программы SysTray/2.
Прототип: BOOL AddTrayIcon(HWND hwnd, HPOINTER hptr);
Параметры:
HWND hwnd - указывает на клиентское окно приложения. Необходим
для обратной связи программы-сервера с программой-клиентом.
HPOINTER hptr - указывает на значок, добавляемый в системный трей.
Дескприптор значка при этом должен быть общедоступным, т.е. "отданным"
через функцию WinSetPointerOwner. Подробнее об этой функции читайте в
справочных файлах OS/2 Toolkit. Если же в этом параметре указан NULLHANDLE,
то значок будет взят из окна-фрейма (поскольку эти значки всегда общедоступны).
Возвращаемое значение: BOOL rc - FALSE в случае ошибки.
После выполнения этой функции значок вашей программы должен появится в
системном трее. Если же этого не произошло, то стоит проверить возвращаемое
значение функции AddTrayIcon. Типичная ситуация ошибки - неактивность
программы-сервера (для SysTray/WPS - отсутствие systrayd.exe в списке процессов).
Обратная связь
Обратная связь с программой клиентом осуществляется таким образом: клиентскому
окну отсылаются сообщения о вводе (щелчке мышкой, например), который производится
над значком приложения в системном трее.
Отсылаются следующие сообщения:
WM_BUTTON1CLICK
WM_BUTTON2CLICK
WM_BUTTON3CLICK
WM_BUTTON1DBLCLK
WM_BUTTON2DBLCLK
WM_BUTTON3DBLCLK
WM_BUTTON1UP
WM_BUTTON2UP
WM_BUTTON3UP
WM_BUTTON1DOWN
WM_BUTTON2DOWN
WM_BUTTON3DOWN
WM_BEGINSELECT
WM_BEGINDRAG
WM_ENDSELECT
WM_ENDDRAG
WM_MOUSEMOVE
WM_CONTEXTMENU
Однако, программа-сервер немного изменяет значения этих сообщений так, чтобы
они не конфликтовали с традиционными сообщениями Presentation Manager в
самой программе. Для этого ко всем сообщениям применяется операция битового
ИЛИ со значением 0x2000.
В ответ на реакцию пользователя (например, вызов контекстного меню над
значком), программа-клиент может вывести всплывающее меню или изменить
вид значка. Для изменения вида значка (например, для анимации) применяется
функция ChangeTrayIcon.
Функция ChangeTrayIcon
Прототип: BOOL ChangeTrayIcon(HWND hwnd, HPOINTER hptr);
Параметры:
HWND hwnd - указывает на клиентское окно приложения. Необходим
для успешного поиска окна приложения во внутреннем списке системного трея.
HPOINTER hptr - то-же что и для AddTrayIcon.
Возвращаемое значение: BOOL rc - FALSE в случае ошибки.
Удаление значка из системного трея
Делать этого, конечно, не обязательно, но желательно.
Для этого используейте функцию DeleteTrayIcon. После вызова этой функции значок
программы-клиента в системном трее будет удален.
Прототип: BOOL DeleteTrayIcon(HWND hwnd, HPOINTER hptr);
Параметры:
HWND hwnd - указывает на клиентское окно приложения. Необходим
для успешного поиска окна приложения во внутреннем списке системного трея.
Возвращаемое значение: BOOL rc - FALSE в случае ошибки.
Примеры использования
Пример программы на Си
Пример программы на Паскале (Virtual Pascal)
Discuss publication (replies:0)
|