Einzelnen Beitrag anzeigen

Meta777

Registriert seit: 8. Sep 2004
Ort: Magdeburg
248 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

Re: Icon im Tray (TNA) animieren bzw. ändern

  Alt 4. Feb 2010, 23:22
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;
  Mit Zitat antworten Zitat