Системный трей Delphi Application

Посмотрите на панель задач. Видите, где находится время? Есть ли там другие иконки? Место называется Windows System Tray. Хотите разместить свой Delphi значок приложения есть? Хотите ли вы, чтобы этот значок был анимированным или отражал состояние вашего приложения?

Это было бы полезно для программ, которые остаются запущенными в течение длительного периода времени без вмешательства пользователя (фоновые задачи, которые вы обычно выполняете на своем компьютере в течение всего дня).

Что вы можете сделать, так это заставить ваши приложения Delphi выглядеть так, как будто они сворачиваются в лоток (а не в Панель задач, справа от кнопки Win Start), поместив значок в трее и одновременно делая ваши формы невидимый.

Давайте подносим это

К счастью, создать приложение, которое запускается в системном трее, довольно просто - для выполнения этой задачи требуется только одна функция (API), Shell_NotifyIcon.

Функция определена в Модуль ShellAPI и требует двух параметров. Первый - это флаг, указывающий, добавляется, изменяется или удаляется значок, а второй - указатель на структуру TNotifyIconData, содержащую информацию о значке. Это включает в себя дескриптор значка для отображения, текст для отображения в качестве всплывающей подсказки, когда мышь находится над значком, дескриптор окна, которое будет получать сообщения о значке и тип сообщения, которое отправит значок окно.

instagram viewer

Во-первых, в частном разделе вашей основной формы поместите строку:
TrayIconData: TNotifyIconData;

тип
TMainForm = учебный класс(ТГогт)
процедура FormCreate (Отправитель: TObject);
частный
TrayIconData: TNotifyIconData;
{Частные объявления}общественности{Публичные декларации}конец;

Затем в вашей основной форме OnCreate метод, инициализируйте структуру данных TrayIconData и вызовите функцию Shell_NotifyIcon:

с TrayIconData dobegin
cbSize: = SizeOf (TrayIconData);
Wnd: = Ручка;
uID: = 0;
uFlags: = NIF_MESSAGE + NIF_ICON + NIF_TIP;
uCallbackMessage: = WM_ICONTRAY;
hIcon: = применение. Икона. Ручка;
StrPCopy (szTip, Приложение. Заглавие);
конец;
Shell_NotifyIcon (NIM_ADD, @TrayIconData);

Параметр Wnd структуры TrayIconData указывает на окно, которое получает уведомления, связанные со значком.

Значок указывает на значок, который мы хотим добавить в трее - в этом случае используется основной значок приложения.
SzTip содержит текст всплывающей подсказки для отображения значка - в нашем случае это название приложения. SzTip может содержать до 64 символов.
Параметр uFlags установлен, чтобы указывать значку обрабатывать сообщения приложения, использовать значок приложения и его подсказку. uCallbackMessage указывает на определенный приложением идентификатор сообщения. Система использует указанный идентификатор для уведомлений, которые она отправляет окну, идентифицированному Wnd, всякий раз, когда в ограничивающем прямоугольнике значка происходит событие мыши. Для этого параметра задана постоянная WM_ICONTRAY, определенная в разделе интерфейса модуля форм, и равна: WM_USER + 1;

Вы добавляете значок в лоток, вызывая функцию API Shell_NotifyIcon. Первый параметр «NIM_ADD» добавляет значок в область «Лоток». Два других возможных значения, NIM_DELETE и NIM_MODIFY, используются для удаления или изменения значка в трее - мы увидим, как позже в этой статье. Второй параметр, который мы отправляем в Shell_NotifyIcon - это инициализированная структура TrayIconData.

Взять одну

Если вы ЗАПУСТИТЕ свой проект сейчас, вы увидите значок рядом с часами в трее. Обратите внимание на три вещи.

1) Во-первых, ничего не происходит, когда вы щелкаете (или делаете что-либо еще с помощью мыши) значок, расположенный на панели задач, - мы еще не создали процедуру (обработчик сообщений).
2) Во-вторых, есть кнопка на панели задач (мы явно не хотим ее там).
3) В-третьих, когда вы закрываете приложение, значок остается в трее.

Возьми два

Давайте решим это в обратном направлении. Чтобы удалить значок из панели задач при выходе из приложения, необходимо снова вызвать Shell_NotifyIcon, но с NIM_DELETE в качестве первого параметра. Вы делаете это в OnDestroy обработчик события для основной формы.

процедура TMainForm. FormDestroy (Отправитель: TObject);
начать
Shell_NotifyIcon (NIM_DELETE, @TrayIconData);
конец;

Чтобы скрыть приложение (кнопку приложения) от панели задач, мы воспользуемся простым приемом. В исходный код проекта добавьте следующую строку: Приложение. ShowMainForm: = False; до применения. CreateForm (TMainForm, MainForm); Например, пусть это будет выглядеть так:

...
начать
Заявка. Инициализировать;
Заявка. ShowMainForm: = False;
Заявка. CreateForm (TMainForm, MainForm);
Заявка. Бегать;
конец.

И наконец, чтобы наша иконка в трее реагировала на события мыши, нам нужно создать процедуру обработки сообщений. Сначала мы объявляем процедуру обработки сообщений в общедоступной части объявления формы: method TrayMessage (var Msg: TMessage); сообщение WM_ICONTRAY; Во-вторых, определение этой процедуры выглядит так:

процедура TMainForm. TrayMessage (вар Msg: TMessage);
begincase Msg.lParam из
WM_LBUTTONDOWN:
начать
ShowMessage ('Левая кнопка нажата
- давайте покажем форму! ');
MainForm. Показать;
конец;
WM_RBUTTONDOWN:
начать
ShowMessage ('Правая кнопка нажата
- давайте спрячем форму! »);
MainForm. Спрятать;
конец;
конец;
конец;

Эта процедура предназначена для обработки только нашего сообщения WM_ICONTRAY. Он берет значение LParam из структуры сообщения, которая может дать нам состояние мыши после активации процедуры. Для простоты мы будем обрабатывать только левую кнопку мыши (WM_LBUTTONDOWN) и правую кнопку мыши (WM_RBUTTONDOWN). Когда левая кнопка мыши находится на значке, мы показываем основную форму, а когда правая кнопка нажата, мы скрываем ее. Конечно, есть другие сообщения ввода мышью, которые вы можете обработать в процедуре, например, кнопка вверх, двойной щелчок кнопки и т. Д.

Вот и все. Быстро и просто. Далее вы увидите, как анимировать значок в трее и как этот значок отображает состояние вашего приложения. Более того, вы увидите, как отобразить всплывающее меню рядом со значком.

instagram story viewer