Hi,
eine andere Möglichkeit wäre die Verwendung von Shell_NotifyIcon():
Hier einige Auszüge.... Geht nur mit ICONs zum convertieren zw. bmp und ICO gibs hier auch code.
Farbige TrayIcons funktionieren erst ab WinXp.
Das CahngeTrayIcon in nen Thread gepackt ne TimageList mit ICONs dazu und fertig ist das Ganze... Die "WM_USER_ICONMSG" dient lediglich um Mausklicks auf dem icon auszuwerten. Diese Message muss in der WndProc des in "FIconData.Wnd" angegebenen Fensters entsprechend abgefangen werdne.
Shalom
Delphi-Quellcode:
uses
ShellApi;
const
WM_USER_ICONMSG = WM_USER + 123;
var
FIconData: TNotifyIconData;
function GetAppIcon(var AIcon: TIcon; const ASmall: Boolean = False): Boolean;
const
dwIconFlags : array[Boolean]of DWORD = (SHGFI_LARGEICON, SHGFI_SMALLICON);
var
fi : TSHFileInfo;
begin
Result := False;
Assert(AIcon <> nil);
// Symbol der Datei aus dem System ermitteln
// Typ (= groß/klein) richtet sich nach dem
// Funktionsparameter "fSmall" (default = false)
ZeroMemory(@fi, sizeof(fi));
SHGetFileInfo(pchar(Application.Exename), 0, fi, sizeof(fi),
SHGFI_ICON or dwIconFlags[ASmall]);
// Symbol ermittelt
if (fi.hIcon <> 0) then
begin
AIcon.Handle := fi.hIcon;
Result := True;
end;
end;
procedure CreateIconData;
var
i: Integer;
begin
GetAppIcon(FAppIconICO, True);
FIconData.cbSize := SizeOf(FIconData);
FIconData.Wnd := FWindow.Handle;
FIconData.uID := 123;
FIconData.uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
FIconData.uCallBackMessage := WM_USER_ICONMSG;
FIconData.hIcon := FAppIconICO.Handle;
for i := 1 to Length(Application.Title) do begin
FIconData.szTip[i-1] := Application.Title[i];
end;
end;
procedure AddIconToTNA;
begin
if not FTNAIconActive then
if Shell_NotifyIcon(NIM_ADD, @FIconData) then begin
FTNAIconActive := True;
end;
end;
procedure ChangeTrayIcon(AIcon: HICON; const AHint: String);
var
i: Integer;
begin
if AIcon <> INVALID_HANDLE_VALUE then
FIconData.hIcon := AIcon;
for i := 1 to Length(AHint) do begin
FIconData.szTip[i-1] := AHint[i];
end;
Shell_NotifyIcon(NIM_MODIFY, @FIconData); //Icon aktualisiern
end;