Entwickler-Ecke

Windows API - Tray Icon Hint ändern (Eigenes Programm)


F34r0fTh3D4rk - Mo 15.08.05 18:11
Titel: Tray Icon Hint ändern (Eigenes Programm)
hallo, ich habe folgende 2 prozeduren zum hinzufügen und entfernen eines tray icons:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
procedure TaskBarAddIcon;
var
  tnid: TNotifyIconData;
  Owner: HWnd;
begin
  with tnid do
    begin
      cbSize := SizeOf(TNotifyIconData);
      Wnd := MainForm.Handle;
      uID := 1;
      uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
      uCallbackMessage := WM_TASKBAREVENT;
      hIcon := Application.Icon.Handle;
    end;
  StrCopy(tnid.szTip, 'Seth MP3');
  Shell_NotifyIcon(NIM_ADD, @tnid);
  Owner:=GetWindow(MainForm.Handle, GW_OWNER);
  if Owner <> 0 then
    ShowWindow(Owner,SW_HIDE);
end;

procedure TaskBarRemoveIcon;
var
  tnid: TNotifyIconData;
  Owner: HWnd;
begin
  tnid.cbSize := SizeOf(TNotifyIconData);
  tnid.Wnd := MainForm.Handle;
  tnid.uID := 1;
  Shell_NotifyIcon(NIM_DELETE, @tnid);
  Owner:=GetWindow(MainForm.Handle, GW_OWNER);
  if Owner <> 0 then
    begin
      ShowWindow(Owner, SW_Show);
      ShowWindow(Owner, SW_Normal);
    end;
end;

jetzt möchte ich den hint text des tray icons ändern, wie mache ich das ?

danke schonmal ;)


raziel - Mo 15.08.05 19:45

Auch das ist im FAQ-Beitrag [http://www.delphi-forum.de/topic_Icons+in+die+TNA+hinzufuegen+aendern+und+loeschen_8294.html] von user profile iconTino erklärt, sogar mit extra Beispielsource...


F34r0fTh3D4rk - Di 16.08.05 14:12

damit bekomme ich die gleichen fehler wie mit der komponente die ich vorher hatte, nämlich mehr als ein icon, so ist das ja schon gut, das ändern kriege ich jetzt wohl auch hin, danke 8)

EDIT:

Zitat:

[Fehler] UMain.pas(203): Inkompatible Typen: 'Array' und 'String'


wie kriege ich den dazu, meine string variable zu akzeptieren ?


F34r0fTh3D4rk - Di 16.08.05 14:32

so kompiliert er es, aber es funzt net :(

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TaskBarChangeHint(HintText: String);
var
  tnid: TNotifyIconData;
begin
  with tnid do
    begin
      cbSize := SizeOf(TNotifyIconData);
      Wnd := MainForm.Handle;
      uID := 1;
      strcopy(sztip, pchar(hinttext));
    end;
  Shell_NotifyIcon(NIM_MODIFY, @tnid);
end;


na klar, der hint wird ja nur geändert, wenn das icon schon existiert, und das wird ja dann immer überschrieben, so funzt es:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
var
  IcoHint: string = 'default';
  IsIconic: boolean = false;

procedure TaskBarAddIcon;
var
  tnid: TNotifyIconData;
  Owner: HWnd;
begin
  with tnid do
    begin
      cbSize := SizeOf(TNotifyIconData);
      Wnd := MainForm.Handle;
      uID := 1;
      uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
      uCallbackMessage := WM_TASKBAREVENT;
      hIcon := MainForm.Icon.Handle;
    end;
  StrCopy(tnid.szTip, pchar(IcoHint));
  Shell_NotifyIcon(NIM_ADD, @tnid);
  Owner := GetWindow(MainForm.Handle, GW_OWNER);
  if Owner <> 0 then
    ShowWindow(Owner, SW_HIDE);
  IsIconic := true;
end;

procedure TaskBarRemoveIcon;
var
  tnid: TNotifyIconData;
  Owner: HWnd;
begin
  with tnid do
    begin
      cbSize := SizeOf(TNotifyIconData);
      Wnd := MainForm.Handle;
      uID := 1;
    end;
  Shell_NotifyIcon(NIM_DELETE, @tnid);
  Owner := GetWindow(MainForm.Handle, GW_OWNER);
  if Owner <> 0 then
    begin
      ShowWindow(Owner, SW_Show);
      ShowWindow(Owner, SW_Normal);
    end;
  IsIconic := false;
end;

procedure TaskBarChangeHint(HintText: String);
var
  tnid: TNotifyIconData;
begin
  if IsIconic then
    begin
      with tnid do
        begin
          cbSize := SizeOf(TNotifyIconData);
          Wnd := MainForm.Handle;
          uID := 1;
          strcopy(sztip, pchar(hinttext));
        end;
      Shell_NotifyIcon(NIM_MODIFY, @tnid);
    end;
  IcoHint := HintText;
end;


doch net, wenn ein icon besteht und ich den hint text ändern will, passiert nischt, erst wenn ich das icon wieder entferne und dann wieder hinzufüge :?

EDIT: wenn man tnid global macht funzt es !


Regan - Mi 28.01.09 19:13

Du könntest auch TTrayIcon verwenden. Das ist in den neuen Versionen von Delphi standardmäßig dabei.