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:
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..127] of 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..127] of 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:
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; {$EXTERNALSYM NIIF_NONE} NIIF_NONE = $00000000; {$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:
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:
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; dll : DWORD = 0; ver : TDllVersionInfo;
dll := LoadLibrary('shell32.dll'); if(dll <> 0) then begin DllGetVersion := GetProcAddress(dll,'DllGetVersion'); if(@DllGetVersion <> nil) then 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;
if(shell32_ver = 600) then NID.cbSize := sizeof(TNotifyIconData) else if(shell32_ver >= 500) then NID.cbSize := NOTIFYICONDATA_V2_SIZE else NID.cbSize := NOTIFYICONDATA_V1_SIZE;
if(shell32_ver >= 500) then 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:
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:
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.