Если  Вы  в  операционной  сиcтеме  Windows пользуетесь   оболочкой  Explorer,  то  справа  на  TaskBar'е  Вы должны  были  видеть  " углубленную"   область  в  которой, обычно, помещаются  часы, переключатель клавиатуры, регулятор громкости и некоторые  другие утилиты. Они изображаются маленькими иконками и для  них  существуют  ToolTip'ы  как  для  кнопок ToolBar'ов. При щелчке  или  двойном  щелчке  по  такой  иконке  программа обычно выполняет  действие  по  умолчанию,  а  при щелчке правой кнопкой показывает Pop-Up меню. Hа  уровне  оболочки System Tray это приложение, поддерживающее окно,  которое  вы  видите  как " углубленную"  область и некоторый сервис для работы с этим окном.

 Иконка  на  Tray'е    это   просто   картинка,   а   не  окно  какой-либо   программы  (исследование  системы  с  помощью Microsoft Spy++ for  Windows   показывает,  что  это  не окно вообще).  System Tray  отслеживает  события  мыши  над  иконкой и, в случае  надобности, показывает  ToolTip для этой иконки. Так же он отсылает сообщения о  всех действиях мыши над иконкой окну, которое поместило иконку на Tray. Таким  образом,  нельзя  поместить  программу  на  Tray.  Любая  программа  может  добавить  столько  иконок  на  Tray,  сколько ей  необходимо.  При  этом главное окно программы не обязано исчезать  или  минимизироватся  - примером может служить Microsoft Internet  Mail,  помещающая  иконку  " конверт"   на  Tray в случае появления  новых писем.

При  добавлении  иконки  на  Tray вы  указывали окно - обработчик    сообщения  и  сообщение (CallbackMessage). Теперь окно, указанное     вами  будет  при  любых  событиях  мыши, происходящих над иконкой   получать  сообщение,  указанное  при  добавлении иконки. При этом   параметры lParam и wParam будут задействованы следующим образом:

 

       (UINT)wParam   -   содержит ID иконки, над которой произошло

                          событие

       (UINT)lParam   -   содержит стандартное событие мыши, такое

                          как WM_MOUSEMOVE или WM_LBUTTONDOWN.

 

При  этом,  информация  о  клавишах  смены регистра, так же как и     местоположения  события, передаваемые при стандартных " настоящих"     сообщениях мыши, теряются.       Hо  положение  курсора  можно узнать функцией GetCursorPos(), а состояние   клавиш   смены  регистра  -  функцией  GetKeyState(),  описанных в winuser.h.

 

 

Проще всего использовать RxTrayIcon компонент из библиотеки RxLib

Многие программы показывают Pop-Up меню при щелчке на их иконке,  помещенной на Tray, как этого добиться ?

 

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

 

Убираем часы:

Code:

procedure TForm1.Button1Click(Sender: TObject);

var hn: HWnd;

begin

hn := FindWindowEx(FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, 'TrayNotifyWnd', nil), 0, 'TrayClockWClass', nil);

if hn <> 0 then

   ShowWindow(hn, SW_HIDE); //Bye,bye,Baby

end;

 

 

Данный код сперва конвертирует Ваш текст в DIB, а затем DIB в иконку и далее в ресурс. После этого изображение иконки отображается в System Tray.

 Вызов просходит следующим образом....

 StringToIcon('This Is Made By Ruslan K. Abu Zant');

N.B>> Не забудьте удалить объект HIcon, после вызова функции...

 

 

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

Вы, наверное, видели множество примеров, которые показывают как скрывать панель задач или кнопку Пуск. Но вот как скрыть только System Tray ?

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

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