Entwickler-Ecke

Windows API - Icon in Tray


Stevie - Mo 02.06.03 13:15
Titel: Icon in Tray
Hi,

ich hab folgendes Problem: Ich hab mein Programm bereits aus der Taskleiste in den Tray verbannt. Jetzt möchte ich bei einem bestimmten Ereignis das Icon verändern. Am besten wäre eine kleine Animation. Ich hab das schon versucht:

Delphi-Quelltext
1:
2:
3:
myIcon.LoadFromFile('NewMail.ico'); <-- var myIcon: TIcon;
TrayIcon.hIcon := myIcon.Handle;
Shell_NotifyIcon(NIM_MODIFY, @TrayIcon);

Das Icon ändert sich nicht und wenn ich das Fenster wiederherstelle, kann ich es nicht wieder minimieren.


MaxiTB - Mo 02.06.03 13:53

Kann dir nur soviel sagen - der Code ist korrekt - bis auf eine Kleinigkeit ...

Wo werden die restlichen Eigenschaften von TrayIcon gesetzt ?
Da gehört ja noch einiges dazu - ganz wichtig cbSize usw.


Tino - Mo 02.06.03 13:55

Hallo,

wo genau ist die Variable TrayIcon definiert? In der Procedure oder global zum Beispiel in der Form Deklaration?

Gruß
Tino


Stevie - Mo 02.06.03 13:56

Die hab ich ja schon vorher gesetzt, wenn ich das Programm starte:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TfrmMyProgram.FormShow(Sender: TObject);
begin
  ShowWindow(Application.Handle, SW_HIDE);
  with TrayIcon do begin
    cbSize := SizeOf(TrayIcon);
    Wnd := Handle;
    uID := 0;
    uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
    uCallbackMessage := IC_CLICK;
    hIcon := Application.Icon.Handle;
    szTip := 'Mein Programm';
  end;
  Shell_NotifyIcon(NIM_ADD, @TrayIcon);
end;

Tino hat folgendes geschrieben:
In der Procedure oder global zum Beispiel in der Form Deklaration?


Global deklariert.


MaxiTB - Mo 02.06.03 14:01

TrayIcon ist also keine lokale Variable ... aha ...

Ups ...

Hast du dir schon mal angeschaut, was Handle für einen Wert hat ?
Unter C++ z.B. bekommt man für HWND=NULL wenn es nicht sichtbar ist (hide) !


Stevie - Mo 02.06.03 14:05

Nee, hab ich noch nicht nachgeschaut, aber das Anlegen des Icons funzt ja. Ich kann das Icon nur nicht wieder ändern. Oder klappt das nur, wenn das Fenster bzw. die Applikation wieder aktiv/sichtbat ist? Ich probier mal was aus...


Tino - Mo 02.06.03 14:08

Das Record TrayIcon müsste also noch gültige Werte haben. Dann sollte es eigentlich auch funktionieren.

Gruß
Tino


MaxiTB - Mo 02.06.03 14:10

Eigentlich nicht - und du änderst ja auch nicht das Hwnd ... also eigentlich - wie am Anfang gesagt, paßt alles.

Einzig und alleine beim Anlagen muß das Fenster sichtbar sein (oder besser gesagt ein gültiges Handle haben).