Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Создать, изменить и удалить TrayIcon

Delphi , Рабочий стол , TrayBar

Создать, изменить и удалить TrayIcon

В программах для Window 95 и выше часто используется TrayIcon – иконка справа на TaskBar, которая позволяет программе почти не занимать места на экране и при этом быть всегда доступной. Для работы с TrayIcon используется функция Shell_NotifyIcon, в которую передается команда: NIM_ADD, NIM_MODIFY или NIM_DELETE для создания изменения и удаления соответственно, и структура TNotifyIconData. У каждой TrayIcon в вашем приложении должен быть свой uID.


const
  WM_NOTIFYTRAYICON = WM_USER + 1;
...
private
  procedure WMTRAYICONNOTIFY(var Msg: TMessage); message WM_NOTIFYTRAYICON;
...
uses
  ShellAPI;

procedure TForm1.WMTRAYICONNOTIFY(var Msg: TMessage);
var
  s: string;
begin
  case Msg.LParam of
    WM_MOUSEMOVE:     s := 'Мышь сдвинута';
    WM_LBUTTONDOWN:   s := 'Левая кнопка нажата';
    WM_LBUTTONUP:     s := 'Левая кнопка отпущена';
    WM_LBUTTONDBLCLK: s := 'Два раза нажата левая кнопка';
    WM_RBUTTONDOWN:   s := 'Правая кнопка нажата';
    WM_RBUTTONUP:     s := 'Правая кнопка отпущена';
    WM_RBUTTONDBLCLK: s := 'Два раза нажата правая кнопка';
    else              s := IntToStr(Msg.LParam);
  end;
  ListBox1.Items.Add(s);
  ListBox1.ItemIndex := ListBox1.Items.Count - 1;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  tray: TNotifyIconData;
  Ic: TIcon;
begin
  Ic := TIcon.Create;
  Ic.LoadFromFile('Icon1.ico');
  with tray do
  begin
    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;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  tray: TNotifyIconData;
  Ic: TIcon;
begin
  Ic := TIcon.Create;
  Ic.LoadFromFile('Icon2.ico');
  with tray do
  begin
    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;
begin
  with tray do
  begin
    cbSize := SizeOf(TNotifyIconData);
    Wnd := Form1.Handle;
    uID := 1;
  end;
  Shell_NotifyIcon(NIM_DELETE, Addr(tray));
end;

Программа на языке Delphi, которая демонстрирует создание, изменение и удаление иконки в области системного трея Windows. Вот разбивка кода:

Создание иконки в области системного трея

В обработчике события FormCreate создается новый объект TNotifyIconData и заполняется необходимыми данными:

var
  tray: TNotifyIconData;
  Ic: TIcon;

begin
  Ic := TIcon.Create;
  Ic.LoadFromFile('Icon1.ico');
  with tray do
  begin
    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;
end;

Функция Shell_NotifyIcon вызывается с флагом NIM_ADD, чтобы создать новую иконку в области системного трея. Объект TNotifyIconData содержит информацию,such as window handle (Wnd), уникальный ID (uID), иконка (hIcon) и текст подсказки (szTip).

Изменение иконки в области системного трея

В обработчике события Button1Click создается новый объект TNotifyIconData с другой иконкой и текстом подсказки:

procedure TForm1.Button1Click(Sender: TObject);
var
  tray: TNotifyIconData;
  Ic: TIcon;

begin
  Ic := TIcon.Create;
  Ic.LoadFromFile('Icon2.ico');
  with tray do
  begin
    cbSize := SizeOf(TNotifyIconData);
    Wnd := Form1.Handle;
    uID := 1; // Same ID as before, so the icon will be updated instead of replaced
    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;

Функция Shell_NotifyIcon вызывается с флагом NIM_MODIFY, чтобы обновить существующую иконку в области системного трея. Заметим, что поле uID остается тем же, что и раньше, поэтому иконка будет обновлена вместо замены.

Удаление иконки из области системного трея

В обработчике события FormDestroy удаляется иконка:

procedure TForm1.FormDestroy(Sender: TObject);
var
  tray: TNotifyIconData;

begin
  with tray do
  begin
    cbSize := SizeOf(TNotifyIconData);
    Wnd := Form1.Handle;
    uID := 1; // Same ID as before, so the icon will be deleted
  end;

  Shell_NotifyIcon(NIM_DELETE, Addr(tray));
end;

Функция Shell_NotifyIcon вызывается с флагом NIM_DELETE, чтобы удалить иконку из области системного трея.

В целом, этот код демонстрирует создание, изменение и удаление иконки в области системного трея в Delphi с помощью функции Shell_NotifyIcon.

В статье описывается создание, изменение и удаление TrayIcon в Windows-приложении с использованием функции Shell_NotifyIcon и сообщения WM_NOTIFYTRAYICON.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TrayBar ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-07-05 20:43:41/0.0064890384674072/0