Entwickler-Ecke

Windows API - Fenster für TNA-Icon benötigt?


wulfskin - Mo 21.03.05 15:53
Titel: Fenster für TNA-Icon benötigt?
Hallo,

ich schreibe gerade mein erstes Non-VCL-Programm, dass für das Update meines Programmes zuständig ist und eigentlich nur ein Icon im TNA ("SysTray") benötigt. Nun habe ich einfach mal eine Konsolenanwendung erstellt und ein TNA-Icon erstellt. Doch das Icon wird nicht angezeigt, jediglich der Platz wird "reserviert". Wenn ich mit der Maus darübergehe, dann geht es auch wieder weg.
Kann es sein das ich ein Fenster (wenn auch unsichtbar) brauche um dieses erzeugen zu können? Und wenn das so ist, wie sieht der kürzeste Aufbau eines solchen aus (RegisterClassEx + CreatewindowEx?)?

Danke, Hape!


Delete - Mo 21.03.05 15:54

Ja du benötigts ein Fenster, denn an irgfendein fenster muss das Icon seine Nachricht schicken.


wulfskin - Mo 21.03.05 16:14

Fehler gefunden:

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:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
program AutoUpdate;

uses
  Windows,
  Messages,
  ShellApi;

const
  ClassName = 'WndClass';
  AppName = 'Geheim';

  WM_SHELLNOTIFY = WM_USER + 1;

var
  TrayIcon: TNotifyIconData = (
    cbSize          : SizeOf(TNotifyIconData);
    uID             : 0//egal, da nur ein Icon
    uFlags          : NIF_MESSAGE + NIF_ICON + NIF_TIP;
    uCallbackMessage: WM_SHELLNOTIFY;
    hIcon           : 0//später wird es noch geladen
    szTip           : 'Updates suchen...';
  );

function WndProc(hWnd: HWND; uMsg: UINT; wParam: wParam; lParam: LParam):
  lresult; stdcall;
begin
  Result := 0;
  case uMsg of
    WM_CREATE:
      begin
        //TNA Icon erstellen
        TrayIcon.Wnd := hWnd;
        TrayIcon.hIcon := LoadImage(hInstance, MAKEINTRESOURCE(IDI_APPLICATION),
          IMAGE_ICON, 000);
        Shell_NotifyIcon(NIM_ADD, @TrayIcon);
{        if IsUpdateAvailable then begin

        end;      }

//        SendMessage(hWnd, WM_CLOSE, 0, 0);
      end;
    WM_DESTROY:
      begin
        //TNA Icon entfernen
        Shell_NotifyIcon(NIM_DELETE, @TrayIcon);
        PostQuitMessage(0);
      end;
    WM_SHELLNOTIFY:
      begin
      end;
  else
    Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
  end;
end;

var
  WindowClass: TWndClassEx = (
    cbSize          : SizeOf(TWndClassEx);
    Style           : CS_HREDRAW or CS_VREDRAW;
    lpfnWndProc     : @WndProc;
    cbClsExtra      : 0;
    cbWndExtra      : 0;
    hbrBackground   : COLOR_APPWORKSPACE;
    lpszMenuName    : nil;
    lpszClassName   : ClassName;
    hIconSm         : 0;
  );
  Msg: TMsg;

{Hauptprogramm}
begin
  WindowClass.hInstance  := hInstance;
  //Fenster registrieren
  RegisterClassEx(WindowClass);
  //Fenster anzeigen
  CreateWindowEx(0, ClassName, AppName, WS_CAPTION or WS_SYSMENU, CW_USEDEFAULT,
    CW_USEDEFAULT, 30030000, hInstance, nil);
  //Nachrichtenschleife starten
  while True do
  begin
    if not GetMessage(Msg, 000then
      Break;
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
  ExitCode := Msg.wParam;
end.
Großteil aus Luckies Beispielen übernommen.

Danke, Hape!