Autor Beitrag
mike3k
Hält's aus hier
Beiträge: 3

Win98/XP
D5, D7 Pro
BeitragVerfasst: Mi 30.04.03 12:32 
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
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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.
ausblenden volle Höhe 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.