Как поместить иконку в трей при помощи Delphi
Посмотрите на панель задач, в ту часть, где находятся часики. Есть там другие иконки? Это место называется Windows System Tray. Хотите поместить значок своего приложения туда же? Тогда эта статья для Вас!
Это было бы полезно для программ, которые работают длительное время без какого-либо взаимодействия с пользователем (фоновых задач, которые обычно запущены на компьютере в течение всего дня).
Помещаем иконку в трей
К слову сказать, создать приложение, которое запускается с иконкой в системном трее довольно легко – только одна функция API Shell_NotifyIcon необходима для выполнения этой задачи.
Функция объявлена в модуле ShellApi и ей передается два параметра. Первый параметр – флаг, который указывает на то, добавляется иконка в данный момент или удаляется, а второй параметр представляет собой указатель на структуру TNotifyIconData, в которой хранится информация об иконке (дескриптор иконки для отображения, текст всплывающей подсказки при наведении указателя мыши на иконку, дескриптор окна, которое будет получать сообщения от иконки и тип сообщения, которое будет послано окну).
Для начала добавьте ShellApi в раздел uses Вашей формы, затем добавьте эти строки:
const WM_ICONTRAY = WM_USER + 1; type TMainForm = class(TForm) procedure FormCreate(Sender: TObject); private TrayIconData: TNotifyIconData; { Private declarations } public { Public declarations } end;
Затем в методе OnCreate нужно инициализировать структуру данных TrayIconData и вызов функции Shell_NotifyIcon:
procedure TForm1.FormCreate(Sender: TObject); begin with TrayIconData do begin cbSize:= System.SizeOf(TrayIconData); Wnd:= Handle; uID:= 0; uFlags:= NIF_MESSAGE + NIF_ICON + NIF_TIP; uCallbackMessage:= WM_ICONTRAY; hIcon:= Application.Icon.Handle; szTip:= 'Допустим, название Вашего приложения'; end; Shell_NotifyIcon(NIM_ADD, @TrayIconData); end;
Параметр Wnd из TrayIconData указывает на окно, которое будет получать сообщения от иконки. HIcon указывает на значок, который будет отображаться в трее. В нашем случае – значок приложения. szTip содержит текст всплывающей подсказки, которое будет отображаться при наведении на иконку курсора мыши (может содержать до 64 символов). Параметр uFlags установлен для обработки сообщений приложения.
Если Вы запустите Ваш проект сейчас, Вы увидите значок Вашего приложения в трее, но ничего не происходит при нажатии на нем мышкой.
При закрытии приложения нам нужно удалить значок из трея:
procedure TForm1.FormDestroy(Sender: TObject); begin Shell_NotifyIcon(NIM_DELETE, @TrayIconData); end;
И, наконец, чтобы наша иконка реагировала на события мыши, а также появлялось всплывающее меню нужно создать процедуру обработки сообщений, а также добавить компонент TPopupMenu на форму и создать в нем пункты меню.
Сначала мы объявим процедуру обработки сообщений в области public объявления формы.
{ … } public { Public declarations } procedure TrayMessage(var Msg: TMessage); message WM_ICONTRAY; { … }
И напишем код:
procedure TForm1.TrayMessage(var Msg: TMessage); var P: TPoint; begin case Msg.LParam of WM_LBUTTONDOWN: ShowMessage('Нажата левая кнопка мыши'); WM_RBUTTONDOWN: begin GetCursorPos(p); PopupMenu1.Popup(P.X, P.Y); end; end; end;
Ну вот и все! Быстро и просто: есть подсказка, есть всплывающее меню, а также иконка находится в трее.
Комментарии