unit shellUnit;
interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Menus;
const
WM_MYICONNOTIFY = WM_USER + 123;
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
RestoreItem: TMenuItem;
N1: TMenuItem;
FileExitItem1: TMenuItem;
HideItem: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure RestoreItemClick(Sender: TObject);
procedure HideItemClick(Sender: TObject);
procedure FileExitItem1Click(Sender: TObject);
private{ Private declarations }
ShownOnce: Boolean;
public{ Public declarations }procedure WMICON(var msg: TMessage); message WM_MYICONNOTIFY;
procedure WMSYSCOMMAND(var msg: TMessage); message WM_SYSCOMMAND;
procedure RestoreMainForm;
procedure HideMainForm;
procedure CreateTrayIcon(n: Integer);
procedure DeleteTrayIcon(n: Integer);
end;
var
Form1: TForm1;
implementation{$R *.DFM}uses ShellApi, shlobj, registry;
procedure TForm1.WMICON(var msg: TMessage);
var
P: TPoint;
begincase msg.LParam of// обработка обратных сообщений
WM_LBUTTONUP: //по нажатию левой клавиши, WM_RBUTTONUP по правойbegin
GetCursorPos(p);
SetForegroundWindow(Application.MainForm.Handle);
PopupMenu1.Popup(P.X, P.Y);
end;
WM_LBUTTONDBLCLK: RestoreItemClick(Self); //как Defaultend;
end;
procedure TForm1.WMSYSCOMMAND(var msg: TMessage);
begininherited; //обработка минимизирвания окна, не сворачевается а скрываетсяif (Msg.wParam = SC_MINIMIZE) then
HideItemClick(Self);
end;
procedure TForm1.HideMainForm;
begin//при сокрытии окна
Application.ShowMainForm := False;
ShowWindow(Application.Handle, SW_HIDE);
ShowWindow(Application.MainForm.Handle, SW_HIDE);
end;
procedure TForm1.RestoreMainForm;
var
i, j: Integer;
begin
Application.ShowMainForm := True;
ShowWindow(Application.Handle, SW_RESTORE);
ShowWindow(Application.MainForm.Handle, SW_RESTORE);
ifnot ShownOnce thenbeginfor I := 0 to Application.MainForm.ComponentCount - 1 doif Application.MainForm.Components[I] is TWinControl thenwith Application.MainForm.Components[I] as TWinControl doif Visible thenbegin
ShowWindow(Handle, SW_SHOWDEFAULT);
for J := 0 to ComponentCount - 1 doif Components[J] is TWinControl then
ShowWindow((Components[J] as TWinControl).Handle,
SW_SHOWDEFAULT);
end;
ShownOnce := True;
end;
end;
procedure TForm1.CreateTrayIcon(n: Integer);
var
nidata: TNotifyIconData;
beginwith nidata dobegin
cbSize := SizeOf(TNotifyIconData);
Wnd := Self.Handle; //HWND вашего окна (окна принимающего обратные сообщения)
uID := 1; // номер значка
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP; //обрабатываемые флаги
uCallBackMessage := WM_MYICONNOTIFY;
hIcon := Application.Icon.Handle;
// то откуда сдергивается значек это может быть и ImageList и т.д.
StrPCopy(szTip, Application.Title);
// всплывающая строка, может быть любой string главное с нулевым окончаниемend;
Shell_NotifyIcon(NIM_ADD, @nidata); // добавление значкаend;
procedure TForm1.DeleteTrayIcon(n: Integer);
var
nidata: TNotifyIconData;
beginwith nidata dobegin
cbSize := SizeOf(TNotifyIconData);
Wnd := Self.Handle;
uID := 1;
end;
Shell_NotifyIcon(NIM_DELETE, @nidata); // удаление значкаend;
procedure TForm1.FormCreate(Sender: TObject);
begin
ShownOnce := False;
CreateTrayIcon(1);
HideItem.Enabled := False;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
DeleteTrayIcon(1);
end;
procedure TForm1.RestoreItemClick(Sender: TObject);
begin
RestoreMainForm;
//если убрать ремарку то при показывании основного окна значек исчезает//DeleteTrayIcon(1);
RestoreItem.Enabled := False;
HideItem.Enabled := True;
end;
procedure TForm1.HideItemClick(Sender: TObject);
begin
HideMainForm;
CreateTrayIcon(1);
HideItem.Enabled := False;
RestoreItem.Enabled := True;
end;
procedure TForm1.FileExitItem1Click(Sender: TObject);
begin
Close;
end;
end.
{Также есть еще такая фигня Shell_NotifyIcon(NIM_Modify, @nidata) позволяет
менять уже установленный значек, не прибегая к его убиванию и построению заново}
Привет! Я перевёл текст на русский язык:
Это фрагмент кода Delphi, демонстрирующий создание иконки в трее и обработку связанных с ней событий. Вот разбивка кода:
Класс TForm1 наследуется от TForm и имеет несколько методов для обработки событий, связанных с иконкой в трее.
В методе WMICON код обрабатывает события нажатия левой кнопки мыши и двойного клика по иконке в трее, вызывая всплывающее меню на позиции курсора. Когда пользователь выбирает пункт меню, вызывается либо RestoreItemClick, либо HideItemClick.
В методе WMSYSCOMMAND код обрабатывает событие минимизации окна, вызывая HideItemClick.
Методы CreateTrayIcon и DeleteTrayIcon создают и удаляют иконку в трее соответственно.
Метод FormCreate создает иконку в трее при создании формы.
Метод FormDestroy удаляет иконку в трее при уничтожении формы.
Методы RestoreItemClick и HideItemClick обрабатывают события восстановления основной формы и скрытия основной формы, вызывая соответственно RestoreMainForm или HideMainForm.
Код также включает несколько констант, типов, переменных и процедур для обработки различных задач, связанных с иконкой в трее.
Вот некоторые предложения по улучшению кода:
Рассмотрите использование более robust способа создания и управления иконкой в трее, например, использования третьей-сторонней библиотеки.
Добавьте комментарии для объяснения цели каждого метода и переменной.
Используйте более описательные имена переменных вместо одиночных буквенных переменных, таких как n или i.
Рассмотрите добавление обработки ошибок в случаях, когда создание или удаление иконки в трее не удается.
Вы можете также рассмотреть использование компонента TNotifyIcon, предоставляемого Delphi, который обеспечивает более простой способ создания и управления иконками в трее.
Вот пример рефакторинга кода:
typeTForm1=class(TForm)...;procedureCreateTrayIcon;procedureDeleteTrayIcon;procedureRestoreItemClick(Sender:TObject);procedureHideItemClick(Sender:TObject);procedureHandleTrayIconMessage(varMsg:TMessage);end;procedureTForm1.CreateTrayIcon;begin// Создайте иконку в трее с иконкой приложения и заголовкомTrayIcon:=TNotifyIcon.Create(nil);TrayIcon.Icon.Assign(Application.Icon);TrayIcon.TipText:=Application.Title;end;procedureTForm1.DeleteTrayIcon;begin// Удалите иконку в трееTrayIcon.Free;end;procedureTForm1.RestoreItemClick(Sender:TObject);begin// Восстановите основную форму и скрыть иконку в трееMainForm.Show;TrayIcon.Visible:=False;end;procedureTForm1.HideItemClick(Sender:TObject);begin// Скрыть основную форму и показать иконку в трееMainForm.Hide;TrayIcon.Visible:=True;end;procedureTForm1.HandleTrayIconMessage(varMsg:TMessage);begincaseMsg.MsgofWM_LBUTTONDOWN:begin// Обработайте событие нажатия левой кнопки мышиend;WM_RBUTTONDOWN:begin// Обработайте событие нажатия правой кнопки мышиend;WM_LBUTTONDBLCLK:begin// Обработайте событие двойного клика по левой кнопке мышиend;end;end;
Обратите внимание, что это только пример и может не работать в вашем конкретном случае. Вам нужно будет модифицировать код для соответствия вашим потребностям.
В статье рассмотрен пример создания иконки в области системы уведомлений (TrayBar) приложения Delphi. Показано, как добавлять, удалять и изменять иконку с помощью функций Shell_NotifyIcon.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.