unit Trayicon;
interfaceuses
SysUtils, Windows, Messages, Classes, Graphics, Controls, ShellAPI, Forms,
menus;
const
WM_TOOLTRAYICON = WM_USER + 1;
WM_RESETTOOLTIP = WM_USER + 2;
type
TTrayIcon = class(TComponent)
private// BDS{ для внутреннего пользования }
hMapping: THandle;
{ Набор переменных }
IconData: TNOTIFYICONDATA;
fIcon: TIcon;
fToolTip: string;
fWindowHandle: HWND;
fActive: boolean;
fShowApp: boolean; // Добавлено
fSendMsg: string;
fShowDesigning: Boolean;
{ События }
fOnClick: TNotifyEvent;
fOnDblClick: TNotifyEvent;
fOnRightClick: TMouseEvent;
fPopupMenu: TPopupMenu;
function AddIcon: boolean;
function ModifyIcon: boolean;
function DeleteIcon: boolean;
procedure SetActive(Value: boolean);
procedure SetShowApp(Value: boolean); // Добавленоprocedure SetShowDesigning(Value: boolean);
procedure SetIcon(Value: TIcon);
procedure SetToolTip(Value: string);
procedure WndProc(var msg: TMessage);
procedure FillDataStructure;
procedure DoRightClick(Sender: TObject);
protectedpublic
FMessageID: DWORD;
constructor create(aOwner: TComponent); override;
procedure Loaded; override; // Добавленоdestructor destroy; override;
procedure GoToPreviousInstance;
publishedproperty Active: boolean read fActive write SetActive;
property ShowDesigning: boolean read fShowDesigning write
SetShowDesigning;
property Icon: TIcon read fIcon write SetIcon;
property IDMessage: string read fSendMsg write fSendMsg;
property ShowApp: boolean read fShowApp write SetShowApp; // Добавленоproperty ToolTip: string read fTooltip write SetToolTip;
property OnClick: TNotifyEvent read FOnClick write FOnClick;
property OnDblClick: TNotifyEvent read FOnDblClick write FOnDblClick;
property OnRightClick: TMouseEvent read FOnRightClick write
FonRightClick;
property PopupMenu: TPopupMenu read fPopupMenu write fPopupMenu;
end;
procedureRegister;
type
PHWND = ^HWND;
implementation{$R TrayIcon.res}procedure TTrayIcon.GoToPreviousInstance;
begin
PostMessage(hwnd_Broadcast, fMessageID, 0, 0);
end;
procedure TTrayIcon.SetActive(Value: boolean);
beginif value <> fActive thenbegin
fActive := Value;
ifnot (csdesigning in ComponentState) thenbeginif Value thenbegin
AddIcon;
endelsebegin
DeleteIcon;
end;
end;
end;
end;
procedure TTrayIcon.SetShowApp(Value: boolean); // Добавленоbeginif value <> fShowApp then
fShowApp := value;
ifnot (csdesigning in ComponentState) thenbeginif Value thenbegin
ShowWindow(Application.Handle, SW_SHOW);
endelsebegin
ShowWindow(Application.Handle, SW_HIDE);
end;
end;
end;
procedure TTrayIcon.SetShowDesigning(Value: boolean);
beginif csdesigning in ComponentState thenbeginif value <> fShowDesigning thenbegin
fShowDesigning := Value;
if Value thenbegin
AddIcon;
endelsebegin
DeleteIcon;
end;
end;
end;
end;
procedure TTrayIcon.SetIcon(Value: Ticon);
beginif Value <> fIcon thenbegin
fIcon.Assign(value);
ModifyIcon;
end;
end;
procedure TTrayIcon.SetToolTip(Value: string);
begin// Данная программа ВСЕГДА переустанавливает текст подсказки и перезагружает// иконку. Текст может быть пустым в случае первой инициализации компонента.// Без инициализации иконка будет пустой и текст подсказки будет отсутствовать.if length(Value) > 62 then
Value := copy(Value, 1, 62);
fToolTip := value;
ModifyIcon;
end;
constructor TTrayIcon.create(aOwner: Tcomponent);
begininherited create(aOwner);
FWindowHandle := AllocateHWnd(WndProc);
FIcon := TIcon.Create;
SetShowApp(False);
end;
destructor TTrayIcon.destroy;
begin// BDS
CloseHandle(hMapping);
if (not (csDesigning in ComponentState) and fActive)
or ((csDesigning in ComponentState) and fShowDesigning) then
DeleteIcon;
FIcon.Free;
DeAllocateHWnd(FWindowHandle);
inherited destroy;
end;
procedure TTrayIcon.Loaded;
var// BDS// hMapping: HWND;
tmp, tmpID: PChar;
begininherited Loaded;
if fSendMsg <> '' thenbegin
GetMem(tmp, Length(fSendMsg) + 1);
GetMem(tmpID, Length(fSendMsg) + 1);
StrPCopy(tmp, fSendMsg);
StrPCopy(tmpID, fSendMsg);
fMessageID := RegisterWindowMessage(tmp);
FreeMem(tmp);
hMapping := CreateFileMapping(HWND($FFFFFFFF), nil, PAGE_READONLY, 0, 32,
tmpID);
if (hMapping <> NULL) and (GetLastError = ERROR_ALREADY_EXISTS) thenbeginifnot (csDesigning in ComponentState) thenbegin
GotoPreviousInstance;
FreeMem(tmpID);
halt;
end;
end;
FreeMem(tmpID);
end;
SetShowApp(fShowApp);
end;
procedure TTrayIcon.FillDataStructure;
beginwith IconData dobegin
cbSize := sizeof(TNOTIFYICONDATA);
wnd := FWindowHandle;
uID := 0; // определенный приложением идентификатор иконки
uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
hIcon := fIcon.Handle;
StrPCopy(szTip, fToolTip);
uCallbackMessage := WM_TOOLTRAYICON;
end;
end;
function TTrayIcon.AddIcon: boolean;
begin
FillDataStructure;
result := Shell_NotifyIcon(NIM_ADD, @IconData);
// По неизвестной причине, если не задан текст всплывающей// подсказки, иконка не выводится. Здесь это учтено.if fToolTip = '' then
PostMessage(fWindowHandle, WM_RESETTOOLTIP, 0, 0);
end;
function TTrayIcon.ModifyIcon: boolean;
begin
FillDataStructure;
if fActive then
result := Shell_NotifyIcon(NIM_MODIFY, @IconData)
else
result := True;
end;
procedure TTrayIcon.DoRightClick(Sender: TObject);
var
MouseCo: Tpoint;
begin
GetCursorPos(MouseCo);
if assigned(fPopupMenu) thenbegin
SetForegroundWindow(Application.Handle);
Application.ProcessMessages;
fPopupmenu.Popup(Mouseco.X, Mouseco.Y);
end;
if assigned(FOnRightClick) thenbegin
FOnRightClick(self, mbRight, [], MouseCo.x, MouseCo.y);
end;
end;
function TTrayIcon.DeleteIcon: boolean;
begin
result := Shell_NotifyIcon(NIM_DELETE, @IconData);
end;
procedure TTrayIcon.WndProc(var msg: TMessage);
beginwith msg doif (msg = WM_RESETTOOLTIP) then
SetToolTip(fToolTip)
elseif (msg = WM_TOOLTRAYICON) thenbegincase lParam of
WM_LBUTTONDBLCLK: if assigned(FOnDblClick) then
FOnDblClick(self);
WM_LBUTTONUP: if assigned(FOnClick) then
FOnClick(self);
WM_RBUTTONUP: DoRightClick(self);
end;
endelse// Обработка всех сообщений с дескриптором по умолчанию
Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
end;
procedureRegister;
begin
RegisterComponents('Win95', [TTrayIcon]);
end;
end.
Это компонент Delphi для создания иконки в системном трее с различными функциями, такими как отображение всплывающей подсказки, обработка кликов и двойных кликов, а также скрытие/показ окна приложения.
Обзор кода:
Класс TTrayIcon наследуется от TComponent и имеет несколько приватных полей для хранения данных, таких как handle иконки, текст всплывающей подсказки и handle окна.
Компонент имеет несколько публичных свойств для настройки поведения, включая:
Active: булевое значение, указывающее, является ли иконка видимой
ShowApp: булевое значение, указывающее, должно ли быть показано или скрыто окно приложения
Icon: объект TIcon, представляющий иконку для отображения в системном трее
ToolTip: строка, представляющая текст всплывающей подсказки для отображения при наведении мыши на иконку
OnClick, OnDblClick и OnRightClick: события для обработки кликов, двойных кликов и правых кликов на иконке
Компонент имеет несколько методов для управления поведением, включая:
AddIcon: добавляет иконку в системный трей
ModifyIcon: модифицирует иконку в системном трее (например, обновляет текст всплывающей подсказки)
DeleteIcon: удаляет иконку из системного трея
SetActive: устанавливает активное состояние иконки (видимое или скрытое)
SetShowApp: показывает или скрывает окно приложения
Компонент также имеет несколько обработчиков событий для обработки сообщений системы, включая:
WndProc: обрабатывает различные сообщения Windows, такие как WM_RESETTOOLTIP и WM_TOOLTRAYICON
DoRightClick: обрабатывает правые клики на иконке, отображая контекстное меню
В целом, этот компонент предоставляет удобный способ создания иконки в системном трее с настраиваемым поведением и обработкой событий.
Некоторые улучшения, которые можно было бы сделать в коде:
Добавление более robust ошибок для случаев, когда иконка не может быть создана или модифицирована
Предоставление более гибких настроек для кастомизации внешнего вида и поведения иконки
Улучшение производительности путем уменьшения ненужных выделений памяти и освобождения ресурсов, когда они не нужны
Примечание: данный код написан на языке Delphi, который является псевдопродуктным языком программирования.
Компонент TrayIcon - это компонент Delphi для создания и управления системной иконкой в трее Windows.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.