Dazu musst du das SystemMenu verändern. Das schöne an Delphi ist, dass der Button in der Taskleiste ein eigenes Fenster ist und somit unabhängig von dem eigentlichen ProgrammFormular ein eigenes Menu hat.
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
SysMenu: HMENU;
i: Integer;
begin
// Hier holen wir uns das Menu aus der Taskleiste...
SysMenu := GetSystemMenu(Application.Handle, False);
// und löschen alle Elemente
while DeleteMenu(SysMenu, 0, MF_BYPOSITION) do;
// Für jedes Element im PopupMenu
for i := 0 to Pred(PopupMenu1.Items.Count) do
begin
// wird abhängig von der Caption...
if PopupMenu1.Items[i].Caption = '-' then
// entweder ein Seperator...
AppendMenu(SysMenu, MF_SEPARATOR, 0, '')
else
// oder ein MenuItem mit einer ID basierend auf dem Index erzeugt
AppendMenu(SysMenu, MF_STRING, WM_USER + Succ(i),
PChar(PopupMenu1.Items[i].Caption));
end;
end;
Dann musst du noch ein TApplicationEvents-Objekt auf deinem Formular plazieren und für das Event OnMessage folgendes festlegen:
Delphi-Quellcode:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
// Wenn ein eigenes Menu angeklickt wurde...
if (Msg.wParam > WM_USER) and
(Msg.wParam <= (WM_User + PopupMenu1.Items.Count)) then
// einen Klick auf das zugehörige PopupMenuItem simulieren...
PopupMenu1.Items[Pred(Msg.wParam - WM_USER)].Click;
end;
Wenn allerdings MenuItems mit Checkhäckchen oder inaktive erstellt werden sollen, ist das etwas aufwändiger. Schau dir doch einfach mal die
MSDN-Dokumentation dazu an.