Um ein Icon im Sytray zu verankern, ist es nötig, zuerst ein PopupMenu im jeweiligen Formular zu platzieren (es sei denn, daß nur der Status an / aus etc. angezeigt werden soll, was aber wenig praxisrelevant ist).

Die in den Ereignissen FormCreate, FormClose und ggf. OnMinimize (nur wenn Hauptformular aus Taskleiste verschwinden soll) vorzunehmenden Einträge könnt Ihr dem untenstehenden Quelltext entnehmen.

bilder/download2.gif (1130 Byte) Demo für Systray-anwendung (gepackte EXE-Datei) 159 KB
Download starten Quellcode (gepackt) 5,7 KB

 

unit systray;

interface

uses
Windows, Messages, SysUtils, Classes, Dialogs, Controls, Forms,
ShellAPI, Menus;

type
TForm2 = class(TForm)
PopupMenu1: TPopupMenu;
Test1: TMenuItem;
Test2: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Test2Click(Sender: TObject);
procedure Test1Click(Sender: TObject);
private
procedure OnMinimize(Sender: TObject);
procedure WndProc(var Msg : TMessage); override;
{ Private-Deklarationen}
public
IconData : TNotifyIconData;
AppData : TAppBarData;
{ Public-Deklarationen}
end;

var
Form2: TForm2;

implementation

{$R *.DFM}


procedure TForm2.WndProc(var Msg : TMessage);
var
p : TPoint;
begin
case Msg.Msg of
WM_USER + 1:
case Msg.lParam of
WM_LBUTTONDBLCLK: begin {do something} end;
WM_RBUTTONDOWN, WM_LBUTTONDOWN: begin
SetForegroundWindow(Handle);
GetCursorPos(p);
PopupMenu1.Popup(p.x, p.y);
PostMessage(Handle, WM_NULL, 0, 0);
end
end;
end;
inherited;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
IconData.cbSize := SizeOf(IconData);
IconData.Wnd := Handle;
IconData.uID := 100;
StrPCopy(IconData.szTip, Application.Title {oder einen anderen String});
IconData.uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
IconData.uCallbackMessage := WM_USER + 1;
IconData.hIcon := Application.Icon.Handle;
Shell_NotifyIcon(NIM_ADD, @IconData); // bei Änderung NIM_MODIFY verwenden
Application.OnMinimize := OnMinimize;
end;

procedure TForm2.OnMinimize(Sender: TObject);
begin
Form2.Hide;
Application.ShowMainForm := False; //keine seperate Anzeige in der Taskleiste
ShowWindow(Application.Handle, SW_HIDE);
end;


procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Shell_NotifyIcon(NIM_DELETE, @IconData);
end;

procedure TForm2.Test2Click(Sender: TObject);
begin
showmessage('Du hast Test gedrückt');
end;

procedure TForm2.Test1Click(Sender: TObject);
begin
Form2.Close;
end;

end.

zurück