Карта сайтаСсылкиКонтакты

Как поместить иконку в трей при помощи Delphi

PDF Печать
Статьи

Поместить иконку приложения в трей средствами 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:= 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;

Ну вот и все! Быстро и просто: есть подсказка, есть всплывающее меню, а также иконка находится в трее.


 

Комментарии   

 
0 #1 Алекс Шепард 13.02.2016 00:17
в TForm1.FormCrea te необходимо SizeOf заменить на System.SizeOf, иначе DX выдает ошибку, т.к. у TNotifyIconData тоже есть метод SizeOf
Цитировать
 

Добавить комментарий


Защитный код
Обновить