Здравствуйте, уважаемые подписчики! Сегодня поговорим о том, как в Delphi создать TrayIcon - иконку справа на TaskBar, которая позволяет программе почти не занимать места на экране и при этом быть всегда легко доступной.
Для работы с TrayIcon используют функцию Shell_NotifyIcon, в которую передается одна из следующих команд: NIM_ADD, NIM_MODIFY или NIM_DELETE - создание, изменение и удаление иконки соответственно. Для обработки событий нужно создать процедуру, которая бы запускалась операционной системой.
Для создания у иконки всплывающего меню нужно создать PopupMenu и при нажатии на правую кнопку заставлять его всплывать.
...
privateprocedure WMTRAYICONNOTIFY(var Msg: TMessage);
message WM_NOTIFYTRAYICON;
procedure DoPopup(Sender: TObject);
public{ Public declarations }end;
var
Form1: TForm1;
implementation{$R *.DFM}uses ShellAPI, Menus;
var
Popup: TPopupMenu;
miOpen, miClose: TMenuItem;
procedure TForm1.WMTRAYICONNOTIFY(var Msg: TMessage);
var
s: String;
p: TPoint;
begincase msg.LParam of
WM_MOUSEMOVE: s := 'Мышь сдвинута';
WM_LBUTTONDOWN: s := 'Левая кнопка нажата';
WM_LBUTTONUP: s := 'Левая кнопка отпущена';
WM_LBUTTONDBLCLK: begin
s := 'Два раза нажата левая кнопка';
DoPopup(miOpen);
end;
WM_RBUTTONDOWN: s := 'Правая кнопка нажата';
WM_RBUTTONUP: begin
s := 'Правая кнопка отпущена';
SetForegroundWindow(Form1.Handle);
GetCursorPos(p);
Popup.Popup(p.x, p.y);
PostMessage(Form1.Handle, WM_NULL, 0, 0);
end;
WM_RBUTTONDBLCLK: s := 'Два раза нажата правая кнопка';
else s := IntToStr(msg.LParam);
end;
ListBox1.Items.Add(s);
ListBox1.ItemIndex := ListBox1.Items.Count - 1;
end;
procedure TForm1.DoPopup(Sender: TObject);
beginif Sender = miClose then Form1.Close elsebegin
ShowWindow(Form1.Handle, SW_SHOWNORMAL);
SetForegroundWindow(Form1.Handle);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
tray: TNotifyIconData;
Ic: TIcon;
begin
Ic := TIcon.Create;
Ic.LoadFromFile('Icon1.ico');
with tray dobegin
cbSize := SizeOf(TNotifyIconData);
Wnd := Form1.Handle;
uID := 1;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage := WM_NOTIFYTRAYICON;
hIcon := Ic.Handle;
szTip := ('Это наша иконка');
end;
Shell_NotifyIcon(NIM_ADD, Addr(tray));
Ic.Destroy;
Popup := TPopupMenu.Create(nil);
miOpen := TMenuItem.Create(nil);
miOpen.Caption := 'Open';
miOpen.Default := true;
miOpen.OnClick := DoPopup;
Popup.Items.Add(miOpen);
miClose := TMenuItem.Create(nil);
miClose.Caption := 'Close';
miClose.OnClick := DoPopup;
Popup.Items.Add(miClose);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
tray: TNotifyIconData;
Ic: TIcon;
begin
Ic := TIcon.Create;
Ic.LoadFromFile('Icon2.ico');
with tray dobegin
cbSize := SizeOf(TNotifyIconData);
Wnd := Form1.Handle;
uID := 1;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage := WM_NOTIFYTRAYICON;
hIcon := Ic.Handle;
szTip := ('Это другая иконка');
end;
Shell_NotifyIcon(NIM_MODIFY, Addr(tray));
Ic.Destroy;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
tray: TNotifyIconData;
beginwith tray dobegin
cbSize := SizeOf(TNotifyIconData);
Wnd := Form1.Handle;
uID := 1;
end;
Shell_NotifyIcon(NIM_DELETE, Addr(tray));
end;