Autor Beitrag
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 01.08.02 10:52 
user defined image
Für die neuen Balloon-Tooltipps von TNA-Icons[meta]TNA[/meta] müssen wir zunächst die "TNotifyIconData"-Struktur erweitern. Das ist IMHO auch bei Delphi6 erforderlich. Die Ansi- und Unicode-Versionen (zu finden in der "ShellAPi.pas") sollten nach den Ergänzungen so aussehen:
ausblenden volle Höhe 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:
type
  _NOTIFYICONDATAA = record
    cbSize: DWORD;
    Wnd: HWND;
    uID: UINT;
    uFlags: UINT;
    uCallbackMessage: UINT;
    hIcon: HICON;
    szTip: array [0..127of AnsiChar;
    dwState: DWORD;
    dwStateMask: DWORD;
    szInfo: array[0..255]of AnsiChar;
    case integer of
      0: (uTimeout: UINT);
      1: (uVersion: UINT;
          szInfoTitle: array[0..63]of AnsiChar;
          dwInfoFlags: DWORD;
          guidItem : TGuid;
         )
  end;
  _NOTIFYICONDATAW = record
    cbSize: DWORD;
    Wnd: HWND;
    uID: UINT;
    uFlags: UINT;
    uCallbackMessage: UINT;
    hIcon: HICON;
    szTip: array [0..127of WideChar;
    dwState: DWORD;
    dwStateMask: DWORD;
    szInfo: array[0..255]of WideChar;
    case integer of
      0: (uTimeout: UINT);
      1: (uVersion: UINT;
          szInfoTitle: array[0..63]of WideChar;
          dwInfoFlags: DWORD;
          guidItem : TGuid;
         )
  end;

Als neue Konstanten haben wir die folgenden Definitionen:
ausblenden volle Höhe 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:
const
  {$EXTERNALSYM NIN_SELECT}
  NIN_SELECT     = WM_USER + 0;
  {$EXTERNALSYM NINF_KEY}
  NINF_KEY       = $01;
  {$EXTERNALSYM NIN_KEYSELECT}
  NIN_KEYSELECT  = NIN_SELECT or NINF_KEY;
  {$EXTERNALSYM NIN_BALLOONSHOW}
  NIN_BALLOONSHOW      = WM_USER + 2;
  {$EXTERNALSYM NIN_BALLOONHIDE}
  NIN_BALLOONHIDE      = WM_USER + 3;
  {$EXTERNALSYM NIN_BALLOONTIMEOUT}
  NIN_BALLOONTIMEOUT   = WM_USER + 4;
  {$EXTERNALSYM NIN_BALLOONUSERCLICK}
  NIN_BALLOONUSERCLICK = WM_USER + 5;
  {$EXTERNALSYM NIM_SETFOCUS}
  NIM_SETFOCUS    = $00000003;
  {$EXTERNALSYM NIM_SETVERSION}
  NIM_SETVERSION  = $00000004;
  {$EXTERNALSYM NOTIFYICON_VERSION}
  NOTIFYICON_VERSION = 3;
  {$EXTERNALSYM NIF_STATE}
  NIF_STATE       = $00000008;
  {$EXTERNALSYM NIF_INFO}
  NIF_INFO        = $00000010;
  {$EXTERNALSYM NIF_GUID}
  NIF_GUID        = $00000020;
  {$EXTERNALSYM NIS_HIDDEN}
  NIS_HIDDEN       = $00000001;
  {$EXTERNALSYM NIS_SHAREDICON}
  NIS_SHAREDICON   = $00000002;
// says this is the source of a shared icon
// Notify Icon Infotip flags
  {$EXTERNALSYM NIIF_NONE}
  NIIF_NONE        = $00000000;
// icon flags are mutualy exclusive
// and take only the lowest 2 bits
  {$EXTERNALSYM NIIF_INFO}
  NIIF_INFO        = $00000001;
  {$EXTERNALSYM NIIF_WARNING}
  NIIF_WARNING     = $00000002;
  {$EXTERNALSYM NIIF_ERROR}
  NIIF_ERROR       = $00000003;
  {$EXTERNALSYM NIIF_ICON_MASK}
  NIIF_ICON_MASK   = $0000000F;
  {$EXTERNALSYM NIIF_NOSOUND}
  NIIF_NOSOUND     = $00000010;

const
  {$EXTERNALSYM NOTIFYICONDATAA_V1_SIZE}
  NOTIFYICONDATAA_V1_SIZE = 88;
  {$EXTERNALSYM NOTIFYICONDATAW_V1_SIZE}
  NOTIFYICONDATAW_V1_SIZE = 152;
  {$EXTERNALSYM NOTIFYICONDATA_V1_SIZE}
  NOTIFYICONDATA_V1_SIZE  = NOTIFYICONDATAA_V1_SIZE;

  {$EXTERNALSYM NOTIFYICONDATAA_V2_SIZE}
  NOTIFYICONDATAA_V2_SIZE = sizeof(NOTIFYICONDATAA) - (sizeof(TGUID));
  {$EXTERNALSYM NOTIFYICONDATAW_V2_SIZE}
  NOTIFYICONDATAW_V2_SIZE = sizeof(NOTIFYICONDATAW) - (sizeof(TGUID));
  {$EXTERNALSYM NOTIFYICONDATA_V2_SIZE}
  NOTIFYICONDATA_V2_SIZE  = NOTIFYICONDATAA_V2_SIZE;


Die zuletzt definierten Konstanten helfen uns, das TNA-Programm so zu gestalten, dass wir immer die korrekte Strukturgröße benutzen. Dazu nehmen wir einfach die Funktion "DllGetVersion", die u.a. von der SHELL32.DLL exportiert wird. Dafür gibt´s diese Mini-Unit:
ausblenden volle Höhe 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:
unit DllVersion;

interface

uses
  Windows;

type
  {$EXTERNALSYM _DLLVERSIONINFO}
  _DLLVERSIONINFO =
    packed record
      cbSize,
      dwMajorVersion,
      dwMinorVersion,
      dwBuildNumber,
      dwPlatformID : dword;
    end;
  TDllVersionInfo = _DLLVERSIONINFO;

  {$EXTERNALSYM _DLLVERSIONINFO2}
  _DLLVERSIONINFO2 =
    packed record
      info1 : _DLLVERSIONINFO;
      dwFlags : dword;
      ul1Version : ULONG;
    end;
  TDllVersionInfo2 = _DLLVERSIONINFO2;

type
  TDllGetVersion  = function(pdvi: POINTER): HRESULT; stdcall;
var
  DllGetVersion   : TDllGetVersion;

implementation
end.


Und so sieht´s dann im Programm aus:
ausblenden volle Höhe 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:
uses
  DllVersion;
var
  shell32_ver : dword = 400// Standardversion 4.0 der "shell32.dll"
  dll         : DWORD = 0;
  ver         : TDllVersionInfo;

{ ... }

// Version der "shell32.dll" herausfinden
dll := LoadLibrary('shell32.dll');
if(dll <> 0then
  begin
    DllGetVersion := GetProcAddress(dll,'DllGetVersion');
    if(@DllGetVersion <> nilthen
      begin
        fillchar(ver,sizeof(TDllVersionInfo),0);
        ver.cbSize := sizeof(TDllVersionInfo);
        if(DllGetVersion(@ver) = NOERROR) then
          shell32_ver := (ver.dwMajorVersion * 100) + ver.dwMinorVersion;
      end;

    FreeLibrary(dll);
  end;

// abhängig von der "shell32.dll" die Strukturgröße setzen!
if(shell32_ver = 600then NID.cbSize := sizeof(TNotifyIconData)
  else if(shell32_ver >= 500then NID.cbSize := NOTIFYICONDATA_V2_SIZE
    else NID.cbSize := NOTIFYICONDATA_V1_SIZE;

// Balloon-Tipps nur ab "shell32.dll" Version 5.0
if(shell32_ver >= 500then
  begin
    NID.uFlags      := NID.uFlags or NIF_INFO;
    NID.szInfo      := 'Ein Beispiel für einen neuen Balloon-Tipp,' +
      #13#10 + 'der auch mehrzeilig sein kann.';
    NID.szInfoTitle := szClassname;
    NID.dwInfoFlags := NIIF_INFO;
  end;

Shell_NotifyIcon(NIM_ADD,@NID);

{ ... }

Wenn wir auf das Erscheinen oder Verschwinden des Balloon-Tipps reagieren wollen, dann müssen wir die neuen NIN_???-Nachrichten heranziehen, die als "LPARAM" an unsere TNA-Nachricht weitergereicht werden. Die TNA-Nachricht ist die, die die meisten so deklarieren:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
const
  WM_TRAYMSG = WM_USER + 10;

{ ... }

NID.uCallbackMessage := WM_TRAYMSG;

Die Auswertung der neuen NIN_???-Nachrichten sieht dann z.B. so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
case uMsg of
  WM_TRAYMSG:
    case lp of
      NIN_BALLOONSHOW:
        MessageBox(0,'I see the balloon! :o)',szClassname,
          MB_OK or MB_ICONINFORMATION);
      NIN_BALLOONHIDE:
        MessageBox(0,'It´s gone ... :o(',szClassname,
          MB_OK or MB_ICONINFORMATION);
    end;
end;


In den "Win32-API-Tutorials für Delphi" werdet ihr (sobald sie online sind) das komplette Beispiel inkl. TNA-Tutorial finden.