Размещение значка приложения на System Tray
Часто программисту приходится сталкиваться с задачей написания приложения, работающего в фоновом режиме и не нуждающегося в месте на Панели задач. Если вы посмотрите на правый нижний угол рабочего стола Windows, то наверняка найдете там приложения, для которых эта проблема решена: часы, переключатель раскладок клавиатуры, регулятор громкости и т. п. Ясно, что, как бы вы не увеличивали и не уменьшали формы своего приложения, попасть туда обычным путем не удастся. Способ для этого предоставляет Shell API.
Те картинки, которые находятся на System Tray – это действительно просто картинки, а не свернутые окна. Они управляются и располагаются панелью System Tray. Она же берет на себя еще две функции: показ подсказки для каждого из значков и оповещение приложения, создавшего значок, обо всех перемещениях мыши над ним.
Весь API System Tray состоит из 1 (одной) функции:
function Shell_NotifyIcon(dwMessage: DWORD; IpData: PNotifylconData): BOOL; PNotifylconData = TNotifylconData; TNotifylconData = record cbSize: DWORD; Wnd: HWND; uID: UINT; uFlags: UINT; uCallbackMessage: UINT; hlcon: HICON; szTip: array [0..63] of AnsiChar; end;
Параметр dwMessage определяет одну из операций: NIM_ADD означает добавление значка в область, NIM_DELETE – удаление, NIM_MODIFY – изменение.
Ход операции зависит от того, какие поля структуры TNotifyiconData будут заполнены.
Обязательным для заполнения является поле cbsize – там содержится размер структуры. Поле wnd должно содержать дескриптор окна, которое будет оповещаться о событиях, связанных со значком. Идентификатор сообщения Windows, которое вы хотите получать от системы о перемещениях мыши над значком, запишите в поле uCallbackMessage.
Если вы хотите, чтобы при этих перемещениях над вашим значком показывалась подсказка, то задайте ее текст в поле szTip. В поле UID задается номер значка – каждое приложение может поместить на System Tray сколько угодно значков. Дальнейшие операции вы будете производить, задавая этот номер. Дескриптор помещаемого значка должен быть задан в поле hIcon. Здесь вы можете задать значок, связанный с вашим приложением, или загрузить свой – из ресурсов.
Примечание
Изменить главный значок приложения можно в диалоговом окне Project/ Options на странице Application. Он будет доступен через свойство Application.Icon. Тут же можно отредактировать и строку для подсказки – свойство Application.Title.
Наконец, в поле uFlags вы должны сообщить системе, что именно вы от нее хотите, или, другими словами, какие из полей hicon, uCaiibackMessage и szTip вы на самом деле заполнили. В этом поле предусмотрена комбинация трех флагов: NIF_ICON, NIF_MESSAGE и NIF_TIP. Вы можете заполнить, скажем, поле szTip, но если вы при этом не установили флаг NIF_TIP, созданный вами значок не будет иметь строки с подсказкой.
Два приведенных ниже метода иллюстрируют сказанное. Первый из них создает значок на System Tray, а второй – уничтожает его.
const WM_MYTRAYNOTIFY = WMJJSER + 123; procedure TForml.CreateTraylcon(n:Integer); var nidata: TNotifyiconData; begin with nidata do begin cbSize: = SizeOf{TNotifyiconData); Wnd: = Self.Handle; uID: = n; uFiags: = NIF_ICON or NIF_MESSAGE or NIFJTIP; uCallBackMessage: = WM_MYTRAYNOTIFY; hicon: = Application.Icon.Handle; szTip: = 'THis is Traylcon Example'; end; Shell_NotifyIcon(NIM_ADD, @nidata); end; procedure TForml.DeleteTraylcon(n:Integer); var nidata: TNotifylconData; begin with nidata do begin cbSize: = SizeOf(TNotifylconData); Wnd: = Self.Handle; uID: = n; end; Shell_NotifyIcon(NIM_DELETE, @nidata); end;
Примечание
He забывайте уничтожать созданные вами значки на System Tray. Это не делается автоматически даже при закрытии приложения. Значок будет удален только после перезагрузки системы.