Für die neuen Balloon-Tooltipps von
TNA-Icons 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:
Code:
[b]type[/b]
_NOTIFYICONDATAA = [b]record[/b]
cbSize: DWORD;
Wnd: HWND;
uID: UINT;
uFlags: UINT;
uCallbackMessage: UINT;
hIcon: HICON;
szTip: [b]array[/b] [0..127] [b]of[/b] AnsiChar;
dwState: DWORD;
dwStateMask: DWORD;
szInfo: [b]array[/b][0..255][b]of[/b] AnsiChar;
[b]case[/b] integer [b]of[/b]
0: (uTimeout: UINT);
1: (uVersion: UINT;
szInfoTitle: [b]array[/b][0..63][b]of[/b] AnsiChar;
dwInfoFlags: DWORD;
guidItem : TGuid;
)
[b]end[/b];
_NOTIFYICONDATAW = [b]record[/b]
cbSize: DWORD;
Wnd: HWND;
uID: UINT;
uFlags: UINT;
uCallbackMessage: UINT;
hIcon: HICON;
szTip: [b]array[/b] [0..127] [b]of[/b] WideChar;
dwState: DWORD;
dwStateMask: DWORD;
szInfo: [b]array[/b][0..255][b]of[/b] WideChar;
[b]case[/b] integer [b]of[/b]
0: (uTimeout: UINT);
1: (uVersion: UINT;
szInfoTitle: [b]array[/b][0..63][b]of[/b] WideChar;
dwInfoFlags: DWORD;
guidItem : TGuid;
)
[b]end[/b];
Als neue Konstanten haben wir die folgenden Definitionen:
Code:
[b]const[/b]
[color=#000080][i]{$EXTERNALSYM NIN_SELECT}[/i][/color]
NIN_SELECT = WM_USER + 0;
[color=#000080][i]{$EXTERNALSYM NINF_KEY}[/i][/color]
NINF_KEY = $01;
[color=#000080][i]{$EXTERNALSYM NIN_KEYSELECT}[/i][/color]
NIN_KEYSELECT = NIN_SELECT [b]or[/b] NINF_KEY;
[color=#000080][i]{$EXTERNALSYM NIN_BALLOONSHOW}[/i][/color]
NIN_BALLOONSHOW = WM_USER + 2;
[color=#000080][i]{$EXTERNALSYM NIN_BALLOONHIDE}[/i][/color]
NIN_BALLOONHIDE = WM_USER + 3;
[color=#000080][i]{$EXTERNALSYM NIN_BALLOONTIMEOUT}[/i][/color]
NIN_BALLOONTIMEOUT = WM_USER + 4;
[color=#000080][i]{$EXTERNALSYM NIN_BALLOONUSERCLICK}[/i][/color]
NIN_BALLOONUSERCLICK = WM_USER + 5;
[color=#000080][i]{$EXTERNALSYM NIM_SETFOCUS}[/i][/color]
NIM_SETFOCUS = $00000003;
[color=#000080][i]{$EXTERNALSYM NIM_SETVERSION}[/i][/color]
NIM_SETVERSION = $00000004;
[color=#000080][i]{$EXTERNALSYM NOTIFYICON_VERSION}[/i][/color]
NOTIFYICON_VERSION = 3;
[color=#000080][i]{$EXTERNALSYM NIF_STATE}[/i][/color]
NIF_STATE = $00000008;
[color=#000080][i]{$EXTERNALSYM NIF_INFO}[/i][/color]
NIF_INFO = $00000010;
[color=#000080][i]{$EXTERNALSYM NIF_GUID}[/i][/color]
NIF_GUID = $00000020;
[color=#000080][i]{$EXTERNALSYM NIS_HIDDEN}[/i][/color]
NIS_HIDDEN = $00000001;
[color=#000080][i]{$EXTERNALSYM NIS_SHAREDICON}[/i][/color]
NIS_SHAREDICON = $00000002;
[color=#000080][i]// says this is the source of a shared icon
// Notify Icon Infotip flags
{$EXTERNALSYM NIIF_NONE}[/i][/color]
NIIF_NONE = $00000000;
[color=#000080][i]// icon flags are mutualy exclusive
// and take only the lowest 2 bits
{$EXTERNALSYM NIIF_INFO}[/i][/color]
NIIF_INFO = $00000001;
[color=#000080][i]{$EXTERNALSYM NIIF_WARNING}[/i][/color]
NIIF_WARNING = $00000002;
[color=#000080][i]{$EXTERNALSYM NIIF_ERROR}[/i][/color]
NIIF_ERROR = $00000003;
[color=#000080][i]{$EXTERNALSYM NIIF_ICON_MASK}[/i][/color]
NIIF_ICON_MASK = $0000000F;
[color=#000080][i]{$EXTERNALSYM NIIF_NOSOUND}[/i][/color]
NIIF_NOSOUND = $00000010;
[b]const[/b]
[color=#000080][i]{$EXTERNALSYM NOTIFYICONDATAA_V1_SIZE}[/i][/color]
NOTIFYICONDATAA_V1_SIZE = 88;
[color=#000080][i]{$EXTERNALSYM NOTIFYICONDATAW_V1_SIZE}[/i][/color]
NOTIFYICONDATAW_V1_SIZE = 152;
[color=#000080][i]{$EXTERNALSYM NOTIFYICONDATA_V1_SIZE}[/i][/color]
NOTIFYICONDATA_V1_SIZE = NOTIFYICONDATAA_V1_SIZE;
[color=#000080][i]{$EXTERNALSYM NOTIFYICONDATAA_V2_SIZE}[/i][/color]
NOTIFYICONDATAA_V2_SIZE = sizeof(NOTIFYICONDATAA) - (sizeof(TGUID));
[color=#000080][i]{$EXTERNALSYM NOTIFYICONDATAW_V2_SIZE}[/i][/color]
NOTIFYICONDATAW_V2_SIZE = sizeof(NOTIFYICONDATAW) - (sizeof(TGUID));
[color=#000080][i]{$EXTERNALSYM NOTIFYICONDATA_V2_SIZE}[/i][/color]
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:
Code:
[b]
unit[/b] DllVersion;
[b]interface[/b]
[b]uses[/b]
Windows;
[b]type[/b]
[color=#000080][i]{$EXTERNALSYM _DLLVERSIONINFO}[/i][/color]
_DLLVERSIONINFO =
[b]packed[/b] [b]record[/b]
cbSize,
dwMajorVersion,
dwMinorVersion,
dwBuildNumber,
dwPlatformID : dword;
[b]end[/b];
TDllVersionInfo = _DLLVERSIONINFO;
[color=#000080][i]{$EXTERNALSYM _DLLVERSIONINFO2}[/i][/color]
_DLLVERSIONINFO2 =
[b]packed[/b] [b]record[/b]
info1 : _DLLVERSIONINFO;
dwFlags : dword;
ul1Version : ULONG;
[b]end[/b];
TDllVersionInfo2 = _DLLVERSIONINFO2;
[b]type[/b]
TDllGetVersion = [b]function[/b](pdvi: POINTER): HRESULT; [b]stdcall[/b];
[b]var[/b]
DllGetVersion : TDllGetVersion;
[b]implementation[/b]
[b]end[/b].
Und so sieht´s dann im Programm aus:
Code:
[b]uses[/b]
DllVersion;
[b]var[/b]
shell32_ver : dword = 400; [color=#000080][i]// Standardversion 4.0 der "shell32.dll"[/i][/color]
dll : DWORD = 0;
ver : TDllVersionInfo;
[color=#000080][i]{ ... }
// Version der "shell32.dll" herausfinden[/i][/color]
dll := LoadLibrary('shell32.dll');
[b]if[/b](
dll <> 0) [b]then[/b]
[b]begin[/b]
DllGetVersion := GetProcAddress(
dll,'DllGetVersion');
[b]if[/b](@DllGetVersion <> [b]nil[/b]) [b]then[/b]
[b]begin[/b]
fillchar(ver,sizeof(TDllVersionInfo),0);
ver.cbSize := sizeof(TDllVersionInfo);
[b]if[/b](DllGetVersion(@ver) = NOERROR) [b]then[/b]
shell32_ver := (ver.dwMajorVersion * 100) + ver.dwMinorVersion;
[b]end[/b];
FreeLibrary(
dll);
[b]end[/b];
[color=#000080][i]// abhängig von der "shell32.dll" die Strukturgröße setzen![/i][/color]
[b]if[/b](shell32_ver = 600) [b]then[/b] NID.cbSize := sizeof(TNotifyIconData)
[b]else[/b] [b]if[/b](shell32_ver >= 500) [b]then[/b] NID.cbSize := NOTIFYICONDATA_V2_SIZE
[b]else[/b] NID.cbSize := NOTIFYICONDATA_V1_SIZE;
[color=#000080][i]// Balloon-Tipps nur ab "shell32.dll" Version 5.0[/i][/color]
[b]if[/b](shell32_ver >= 500) [b]then[/b]
[b]begin[/b]
NID.uFlags := NID.uFlags [b]or[/b] NIF_INFO;
NID.szInfo := 'Ein Beispiel für einen neuen Balloon-Tipp,' +
#13#10 + 'der auch mehrzeilig sein kann.';
NID.szInfoTitle := 'Taskbar-Demo';
NID.dwInfoFlags := NIIF_INFO;
[b]end[/b];
Shell_NotifyIcon(NIM_ADD,@NID);
[color=#000080][i]{ ... }[/i][/color]
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:
Code:
[b]const[/b]
WM_TRAYMSG = WM_USER + 10;
[i]{ ... }[/i]
NID.uCallbackMessage := WM_TRAYMSG;
Die Auswertung der neuen NIN_???-Nachrichten sieht dann z.B. so aus:
Code:
[b]case[/b] uMsg [b]of[/b]
WM_TRAYMSG:
[b]case[/b] lp [b]of[/b]
NIN_BALLOONSHOW:
MessageBox(0,'I see the balloon! :o)',szClassname,
MB_OK [b]or[/b] MB_ICONINFORMATION);
NIN_BALLOONHIDE:
MessageBox(0,'It´s gone ... :o(',szClassname,
MB_OK [b]or[/b] MB_ICONINFORMATION);
[b]end[/b];
[b]end[/b];
In den "
Win32-
API-Tutorials für Delphi" werdet ihr (sobald sie online sind) das komplette Beispiel inkl.
TNA-Tutorial finden.