Работать с Tray без компонентов

Работать с трей без компонентов не очень удобно и понятно, но если один раз понять, то левые компоненты уже не нужны, т.к. можно реализовать всё что угодно.

Во первых изменим стандартный TNotifyIconData на Z_TrayNotify, т.к. в стандарте szTip имеет 63 символа и это не очень удобно.

type
  Z_TrayNotify = record
    cbSize: DWORD;
    Wnd: HWND;
    uID: UINT;
    uFlags: UINT;
    uCallbackMessage: UINT;
    hIcon: HICON;
    szTip: array [0..MAXCHAR] of AnsiChar;
  end;
Во вторых добавим
const
  Ztray = WM_USER + 202;
Теперь две функции которые будут работать с трей.

function Z_AddTray(const Window: HWND; const IconID: Byte; const Icon: HICON;
    const dwMsg: Cardinal; const Hint: string = ''): Boolean;
var
  NID: Z_TrayNotify;
begin
  FillChar(NID, SizeOf(Z_TrayNotify), 0);
  with NID do
  begin
    cbSize := SizeOf(Z_TrayNotify);
    Wnd := Window;
    uID := IconID;
    uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE;
    StrPCopy(szTip, Hint);
    hIcon := Icon;
    uCallbackMessage := ZTray;
  end
  Result := Shell_NotifyIcon(dwMsg, @NID);
end;
С помощью этой функции можно Добавлять и Изменять иконку и подсказку.

function Z_DeleteTray(const Window: HWND): Boolean;
var
  NID: Z_TrayNotify;
begin
  FillChar(NID, SizeOf(Z_TrayNotify), 0);
  with NID do
  begin
    cbSize := SizeOf(Z_TrayNotify);
    Wnd := Window;
  end;
  Result := Shell_NotifyIcon(NIM_DELETE, @NID);
end;
С помощью этой функции удаляем иконку из трей. В третьих добавим после private вот этот обработчик сообщения (ZTray)
function TrayNotify(var Msg: TMessage): boolean;
и конечно сам обработчик
function TForm1.TrayNotify(var Msg: TMessage): boolean;
{
 var
 cur: TPoint;
}
begin
  {GetCursorPos(Cur);}

  Result := false;
  case Msg.Msg of
    ZTray:
      case (Msg.LParam) of
        WM_RBUTTONUP: Application.Restore;

        {WM_RBUTTONUP:
        begin
          SetForegroundWindow(Form1.Handle);
          TrayMenu.Popup(cur.x, cur.y);
        end;}

        WM_LBUTTONUp: Application.Minimize;
      end;
    end;
end;
WM_LBUTTONUP - сворачивает приложение WM_RBUTTONUP - восстанавливает, еще можно добавить меню (TrayMenu - TPopupMenu) и убрать все что в скобках { } Теперь как с этим работать. Сразу при создании формы пишем
Application.HookMainWindow(TrayNotify);
Ставится hook на отлов сообщения. При close или destroy пишем
Z_DeleteTray(Application.Handle); // на всякий случай
Application.unHookMainWindow(TrayNotify);
Снимаем hook На форме 3 кнопки и TrayIcons - TImageList. TrayIcons имеет две картинки 1 кнопка - создание иконки
var
  tIc: TIcon;
begin
  tIc := TIcon.Create;
  TrayIcons.GetIcon(0, tIc);
  Z_AddTray(Application.Handle, 0, tIc.Handle, NIM_ADD,
    'ЛКМ = Свернуть.' + #13 +
    'ПКМ = Развернуть.');

  tIc.Free;
end;
2 кнопка - изменение иконки и подсказки
var
  tIc: TIcon;
begin
  tIc := TIcon.Create;
  TrayIcons.GetIcon(1, tIc);
  Z_AddTray(Application.Handle, 0, tIc.Handle, NIM_MODIFY,
    'Поменял Hint(подсказку) и иконку.' + #13 +
    'Всего Hint вмещает 128 символов');

  tIc.Free;
end;
3 кнопка - удаление иконки
Z_DeleteTray(Application.Handle);
Вот и всё, Удачи!


    No results found.
Отменить.