Приложение за Delphi на системната лента

Погледнете вашата лента със задачи. Вижте района, където се намира времето? Има ли други икони там? Мястото се нарича Windows System Tray. Искате ли да поставите своето Delphi там е иконата на приложението? Искате ли тази икона да бъде анимирана - или да отразява състоянието на вашата кандидатура?

Това би било полезно за програми, които се пускат за дълги периоди от време без взаимодействие с потребители (фонови задачи, които обикновено продължавате да работите на вашия компютър през целия ден).

Това, което можете да направите, е да направите вашите приложения на Delphi да изглеждат така, сякаш се минимизират в тава (вместо към Задача лента, точно до бутона Win Start), като поставите икона в тавата и едновременно направете формулярите си невидим.

Нека го изтърпям

За щастие, създаването на приложение, което работи в системната област, е доста лесно - за изпълнение на задачата е необходима само една (API) функция, Shell_NotifyIcon.

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

instagram viewer

Първо, в частния раздел на основната ви форма поставете реда:
TrayIconData: TNotifyIconData;

Тип
TMainForm = клас(TForm)
процедура 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 сочи към прозореца, който получава съобщения за известия, свързани с икона.

HIcon сочи иконата, която искаме да добавим към тавата - в този случай се използва основната икона на Applications.
SzTip държи текста на Tooltip за показване на иконата - в нашия случай заглавието на приложението. 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);
край;

За да скрием приложението (бутона на приложението) от лентата на задачите, ще използваме прост трик. В изходния код на Projects добавете следния ред: Приложение. ShowMainForm: = Грешно; преди Приложението. CreateForm (TMainForm, MainForm); E.g нека изглежда така:

...
започвам
Приложение. Инициализиране;
Приложение. ShowMainForm: = Грешно;
Приложение. CreateForm (TMainForm, MainForm);
Приложение. Пусни;
край.

И накрая, за да може нашата икона на Tray да реагира на събитията с мишката, трябва да създадем процедура за обработка на съобщения. Първо, ние декларираме процедура за обработка на съобщения в публичната част на декларацията на формуляра: процедура TrayMessage (var Msg: TMessage); съобщение WM_ICONTRAY; Второ, определението на тази процедура изглежда така:

процедура TMainForm. TrayMessage (Var Msg: TMessage);
begincase Msg.lParam на
WM_LBUTTONDOWN:
започвам
ShowMessage („Кликнете върху левия бутон
- нека покажем формуляра! ');
MainForm. Покажи;
край;
WM_RBUTTONDOWN:
започвам
ShowMessage („Натиснат десен бутон
- нека скрием формуляра! ');
MainForm. Крия;
край;
край;
край;

Тази процедура е предназначена да обработва само нашето съобщение, WM_ICONTRAY. Той приема стойността на LParam от структурата на съобщението, която може да ни даде състоянието на мишката при активиране на процедурата. За простота ще се справяме само с лявата мишка надолу (WM_LBUTTONDOWN) и с дясната мишка надолу (WM_RBUTTONDOWN). Когато левият бутон на мишката е надолу върху иконата, ние показваме основната форма, когато десният бутон е натиснат го скриваме. Разбира се, има и други съобщения за въвеждане на мишка, с които можете да се справите в процедурата, например, бутон нагоре, бутон двойно щракване и т.н.

Това е. Бързо и лесно. След това ще видите как да анимирате иконата в тавата и как тази икона да отразява състоянието на вашето приложение. Още повече ще видите как да покажете изскачащо меню близо до иконата.

instagram story viewer