Entwickler-Ecke

Windows API - Pure TNA-Anwendung


mike3k - Mi 30.04.03 12:32
Titel: Pure TNA-Anwendung
Hallo,

bisher bekomme ich nur ein Systray-Icon hin, wenn ich eine Form mit im Projekt habe. Nur benötige ich jetzt auf Grund der Größe eine Anwendung, die nur ein Trayicon erzeugt, welches dann per Klick und Menü eine andere Anwendung startet bzw. sich selbst halt beendet. Hat da jemand eine Idee?

Danke und viele Grüße, Mike3k


Delete - Mi 30.04.03 13:26

Ja, du benötigst im Prinzip nur ein rudimentäres Programm komplett ohne VCL. Das folgende Codebeispiel ist eine Verkürzung der Demo aus den Win32-API-Tutorials von Luckie.

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:
87:
program TaskbarIcon;

uses
  Windows, Messages, ShellAPI;

const
  szClassname = 'TaskbarIcon-Demo';
  WM_TNAMSG   = WM_USER + 10;
var
  NID : TNotifyIconData = (
    uID              : 123;
    uFlags           : NIF_MESSAGE or NIF_ICON or NIF_TIP;
    uCallbackMessage : WM_TNAMSG;
    hIcon            : 0;
    szTip            : szClassname;
  );


//
// "WndProc"
//
function WndProc(wnd: HWND; uMsg: UINT; wp: wParam; lp: LParam): LRESULT; stdcall;
begin
  Result := 0;

  case uMsg of
    WM_CREATE:
      begin
        NID.wnd         := wnd;
        NID.hIcon       := LoadIcon(0,IDI_INFORMATION);
        Shell_NotifyIcon(NIM_ADD,@NID);
        DestroyIcon(NID.hIcon);
      end;
    WM_TNAMSG:
      case lp of
        WM_RBUTTONUP:
          // Rechtsklick mit der Maus
        WM_LBUTTONDBLCLK:
          // Doppelklick mit der Maus
      end;
    WM_DESTROY:
      begin
        Shell_NotifyIcon(NIM_DELETE,@NID);
        PostQuitMessage(0);
      end;
    else
      Result := DefWindowProc(wnd,uMsg,wp,lp);
  end;
end;

//
// MAIN
//
var
  wc: TWndClassEx = (
    cbSize          : sizeof(TWndClassEx);
    Style           : 0;
    lpfnWndProc     : @WndProc;
    cbClsExtra      : 0;
    cbWndExtra      : 0;
    hIcon           : 0;
    hCursor         : 0;
    hbrBackground   : 0;
    lpszMenuName    : nil;
    lpszClassName   : szClassname;
    hIconSm         : 0;
  );
  msg: TMsg;
  aWnd : HWND;

begin
  // Fensterklasse registrieren, & Fenster erzeugen
  wc.hInstance := hInstance;
  if(RegisterClassEx(wc) = 0) then exit;
  aWnd := CreateWindowEx(0,szClassname,szClassname,
    0,0,0,0,0,0,0,hInstance,nil);
  if(aWnd = 0) then exit;
  ShowWindow(aWnd,SW_HIDE);
  UpdateWindow(aWnd);

  // Nachrichtenschleife
  while(GetMessage(msg,0,0,0)) do
    begin
      TranslateMessage(msg);
      DispatchMessage(msg);
    end;
end.

Mehr ist nicht erforderlich. Das vollständige Beispiel inkl. der WinXP-Spielereien gibt´s in der Downloadversion der Tutorials [http://www.delphi-forum.de/viewtopic.php?t=4997].