utrayicon.pas

来自「FMA is a free1 powerful phone editing to」· PAS 代码 · 共 232 行

PAS
232
字号
unit uTrayIcon;

{ WARNING!! This unit will not compile! Its for demontration only }

uses
  Windows, TntWindows, ShellAPI, uVersion;

interface

const
  ID_MYTRYICON = 101;
  WM_MYTRYICON = WM_USER + ID_MYTRYICON + 1;

  {$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;

  { Info Sender ID }
  SID_CPU          = $00010000;
  SID_CLIENT       = $00020000;
  SID_NETWORK      = $00030000;
  SID_OTHER        = $00040000;
  SID_MASK         = $000F0000;

type
  { Version 6 of NotifyIconData }
  TNotifyIconDataA = 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;
    uTimeout: UINT;
    szInfoTitle: array [0..63] of AnsiChar;
    dwInfoFlags: DWORD;
    guidItem: TGUID;
  end;
  TNotifyIconDataW = 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;
    uTimeout: UINT;
    szInfoTitle: array [0..63] of WideChar;
    dwInfoFlags: DWORD;
    guidItem: TGUID;
  end;
  TNotifyIconData = TNotifyIconDataA;

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(TNotifyIconDataA) - (sizeof(TGUID));
  {$EXTERNALSYM NOTIFYICONDATAW_V2_SIZE}
  NOTIFYICONDATAW_V2_SIZE = sizeof(TNotifyIconDataW) - (sizeof(TGUID));
  {$EXTERNALSYM NOTIFYICONDATA_V2_SIZE}
  NOTIFYICONDATA_V2_SIZE  = NOTIFYICONDATAA_V2_SIZE;

  { Usage, add to your form's declarations }
  procedure WMMYTRYICON(var Message: TMessage); message WM_MYTRYICON;

implementation

{ Sample usage procedures }

procedure TMainForm.WMMYTRYICON(var Message: TMessage);
var
  P: TPoint;
begin
  if Message.WParam = ID_MYTRYICON then
    case Message.LParam of
      WM_RBUTTONUP:
        begin
          GetCursorPos(P);
          PopupMenu1.Popup(P.X,P.Y);
        end;
      WM_LBUTTONDOWN,
      WM_LBUTTONDBLCLK:
        if Visible then Hide else Show;
      NIN_BALLOONHIDE,
      NIN_BALLOONTIMEOUT,
      NIN_BALLOONUSERCLICK:
        BaloonVisible := False;
    end;
end;

procedure TMainForm.ShowTrayIcon;
var
  R: TNotifyIconData;
begin
  FillChar(R,SizeOf(R),0);
  R.cbSize := NIBSize;
  R.Wnd := Handle;
  R.uID := ID_MYTRYICON;
  R.uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE;
  R.uCallbackMessage := WM_MYTRYICON;
  R.hIcon := Application.Icon.Handle;
  {}
  StrCopy(@R.szTip[0],PChar(Copy(Application.Title,1,63)));
  {
  if NIBSize = NOTIFYICONDATA_V1_SIZE then
    StrCopy(@R.szTip[0],PChar(Copy(Application.Title,1,63)))
  else
    R.szTip[0] := #0;
  }
  Shell_NotifyIcon(NIM_ADD,@R);
end;

procedure TMainForm.ToolipTrayIcon; // change tooltip
var
  R: TNotifyIconData;
  B: TRarBar;
begin
  FillChar(R,SizeOf(R),0);
  R.cbSize := NIBSize;
  R.Wnd := Handle;
  R.uID := ID_MYTRYICON;
  R.uFlags := NIF_TIP;
  StrCopy(@R.szTip[0],PChar(_('CPU utilization is too high!'),1,63)));
  Shell_NotifyIcon(NIM_MODIFY,@R);
end;

procedure TMainForm.InfoTrayIcon; // show baloon
var
  R: TNotifyIconData;
begin
  if not BaloonVisible and (Tooltips.Count <> 0) then
    begin
      FillChar(R,SizeOf(R),0);
      R.cbSize := NIBSize;
      R.Wnd := Handle;
      R.uID := ID_MYTRYICON;
      R.uFlags := NIF_INFO;
      R.uTimeout := 3000;
      { Remember which object has raised the baloon 
      R.dwInfoFlags := DWORD(AnObjectVariable) and NIIF_ICON_MASK;
      }
      StrCopy(@R.szInfo[0],PChar(Copy('Some text here...',1,255)));
      StrCopy(@R.szInfoTitle[0],PChar('Title'));
      Shell_NotifyIcon(NIM_MODIFY,@R);

      BaloonVisible := True;
    end;
end;

procedure TMainForm.HideTrayIcon;
var
  R: TNotifyIconData;
begin
  FillChar(R,SizeOf(R),0);
  R.cbSize := NIBSize;
  R.Wnd := Handle;
  R.uID := ID_MYTRYICON;
  R.uFlags := NIF_ICON;
  Shell_NotifyIcon(NIM_DELETE,@R);
end;

procedure TMainForm.CalculateTrayIconStructureSize;
var
  s: string;
begin
  SetLength(s,MAX_PATH);
  SetLength(s,GetSystemDirectory(PChar(s),MAX_PATH));
  s := ExtractFileVersionInfo(s+'\shell32.dll','FileVersion'); // do not localize
  if(s[1] = '6') then NIBSize := sizeof(TNotifyIconData)
    else if(s[1] = '5') then NIBSize := NOTIFYICONDATA_V2_SIZE
      else NIBSize := NOTIFYICONDATA_V1_SIZE;
end;

initialization
  CalculateTrayIconStructureSize;
end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?