Как принять событие от иконки в области уведомлений для безоконной программы?

Я могу сделать кликабельную иконку для своего оконного приложения:

unit Unit1;

interface

 uses
  Windows,Messages,Forms,ShellApi,Dialogs;

 type
  TForm1=class(TForm)
   procedure IconMouse(var Msg:TMessage);message WM_USER+1;
   procedure FormCreate(Sender:TObject);
  end;

 var
  Form1:TForm1;

implementation

{$R *.dfm}

procedure TForm1.IconMouse(var Msg:TMessage);
 begin
  case Msg.LParam of
   WM_LBUTTONUP:
    ShowMessage('Hi');
  end;
 end;

procedure TForm1.FormCreate(Sender:TObject);
  var Nim:TNotifyIconData;
 begin
  with Nim do
   begin
    cbSize:=System.SizeOf(Nim);
    Wnd:=Form1.Handle;
    hicon:=Application.Icon.Handle;
    uID:=0;
    uFlags:=NIF_ICON or NIF_MESSAGE;
    uCallbackMessage:=WM_USER+1;
   end;
  Shell_NotifyIcon(NIM_ADD,@Nim);
 end;

end.

Но можно ли как-то сделать тоже самое, только для простой программы?

program Project1

begin
end.

Следуя аналогии, иконку создать получается, а вот как принять от неё сообщение -- не знаю.

program MyProgAaa1;

{$R *.res}

 uses
  Windows,Messages,ShellApi,Dialogs,
  Forms;

procedure IconMouse(var Msg:TMessage);
 begin
  case Msg.LParam of
   WM_LBUTTONUP:
    ShowMessage('Hi!');
  end;
 end;

var Nim:TNotifyIconData;

begin
 with Nim do
  begin
   cbSize:=System.SizeOf(Nim);
   Wnd:=Application.Handle;
   hicon:=Application.Icon.Handle;
   uID:=0;
   uFlags:=NIF_ICON or NIF_MESSAGE;
   uCallbackMessage:=WM_USER+1;
  end;
 Shell_NotifyIcon(NIM_ADD,@Nim);
 while True do
  //как сделать "PeekMessage" для IconMouse()?
end.

Ответы (1 шт):

Автор решения: Lem0nti

Варианты следующие:

  1. Сделать невидимой главную (или любую) форму и в OnCreate также добавить Application.ShowMainForm:=false;
  2. Создать датамодуль и на него положить TTrayIcon.
→ Ссылка