Die "ShellAPI.pas" patchen


Zuerst ist ein Eingriff in die Unit "ShellAPI.pas" erforderlich, da Borland meines Wissens nach auch bei Delphi 6 noch die alte Version ausliefert. Wir benötigen zunächst einen Einblick in das das neue TNotifyIcon-Record. Dabei hilft uns eine aktuelle Version des MSDN oder PSDK. Ich demonstriere die Änderungen nachfolgend an der Ansi-Version. Die Unicode-Version (_NOTIFYICONDATAW) muss analog geändert werden, allerdings ist dort AnsiChar durch WideChar zu ersetzen.

type
  _NOTIFYICONDATAA = record
    cbSize: DWORD;
    Wnd: HWND;
    uID: UINT;
    uFlags: UINT;
    uCallbackMessage: UINT;
    hIcon: HICON;
    szTip: array [0..127] of AnsiChar;
// -- NEU -->>
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;

Und ein paar neue Konstanten sind ebenfalls erforderlich, damit wir die erweiterten Funktionen nutzen können:

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;


Hinweis

Durch die Verwendung von "WM_USER" muss die Unit "Messages.pas" zusätzlich eingebunden werden. Und man sollte für die eigene TNA-Nachricht möglichst nicht mehr den Bereich von "WM_USER" bis "WM_USER + 5" verwenden, da diese Werte von den neuen Nachrichten benutzt werden.

Und damit wir immer die korrekte Recordgröße verwenden, definieren wir noch die folgenden Konstanten. Diese enthalten die Größe des Originalrecord ohne die o.g. Erweiterungen, und die Größe des Records ohne die TGuid-Membervariable:

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;