Thu, 17 May  |   Login Russian version  |  OS2.Ru  
First page
News
Publications
DevCenter
Information Database
Catalog of OS/2 resources
TeamDB
Forums and discussions
Surveys and Contests
Russian Team/2
To the first page of OS2.Ru
 Around OS/2 |  Software and technologies |  Development
Search on: Add OS2.Ru tab to Netscape6/Mozilla Sidebar
OS2.Ru > Articles > Dev > Pub > Systray Using


(print version)

Введение

Появление новых программ, которые открывают интересные возможности, всегда ставит много вопросов перед разработчиками. А уж появление новых интерфейсов, 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.


Функция AddTrayIcon

Прототип: 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)


     Around OS/2 |  Software and technologies |  Development


    Last news
    16/05: Kiev Elephant coming..

    27/03: New survey on RU/2: Best stolen goods

    10/12: New forum about Mozilla

    All news

    Catalog
    Catalog tree
    New Acquisitions

    Articles
    Mutlizilla (how to make multiwindowed Mozilla)
    (Samorukov Alex , Okounkova Irina, 2001-09-06)

    Warpzilla news. An Interview with Mike Kaply
    (Samorukov Alex , 2001-09-04)

    An Interview with Anton Malykh, QU/2 author
    (Okounkov Konstantin, Okounkova Irina, 2001-04-24)

    All publications

    Solutions
    24.09 Test
    Tips & tricks

    Active surveys
    Using of OS2.Ru Tab in Mozilla/Netscape6 Sidebar

    All surveys
    First page  |   News  |   OS2.Ru-Zine  |   Software  |   Development  |   Catalog  |   Rusian Team/2  |   Forums and talks  |   Surveys and Contests  |   OS2.Ru DevCenter
    Design & content © 1996-2000 Copyright WebTeam
    The use of the OS2.Ru materials without the authors' consent is prohibited
    Powered by OS/2