Delphi 系统栏图标

1、结构体

// uses ShellAPI

Type TNotifyIconData = record

    cbSize: DWORD;
    Wnd:    HWND;
    uID:    UINT;
    uFlags: UINT;
    uCallbackMessage: UINT;
    hIcon:  HICON;
    szTip:  array [0..63] of AnsiChar;

end;

属性 意义
cbSize 结构尺寸,必须设为 Sizeof(TNotifyIconData)
Wnd 图标消息发往的窗体
uID 图标号,多个图标以此区别,自定
uFlags 功能设置:(组合相加)

NIF_ICON    显示图标
NIF_MESSAGE 发送消息
NIF_TIP     显示图标 Tip

uCallbackMessage 自定义消息号,必须在窗体中检测此消息
hIcon 图标 Handle, 一般取窗体的 Icon.Handle
szTip 提示文字 Tip

2、API 函数

function Shell_NotifyIcon(dwMessage: DWORD; lpData: PNotifyIconData): BOOL;
属性 意义
dwMessage 功能选择:

NIM_ADD     添加图标
NIM_MODIFY  修改图标
NIM_DELETE  删除图标

lpData 结构体指针

3、消息处理

鼠标在图标上产生消息,回传到 TForm。

Msg 属性 意义
Msg 消息 uCallbackMessage
wParam 图标号 uID
lParam 相关事件,如

M_LBUTTONDown  WM_RBUTTONUp

4、意外处理

任务栏重建时,将发送此消息到每个窗口,窗口应捕获并重新显示图标。

RegisterWindowMessage('TaskbarCreated');

5、示例

// 自定义一个消息代码并注册

Var
   MsgIcon : Cardinal;

Begin
   MsgIcon := RegisterWindowMessage('MyIconMessage');
End;

// 定义 TNotifyIconData 结构体并初始化

Var
   NotifyIcon : TNotifyIconData;

Begin
   With NotifyIcon Do
   Begin
      cbSize := SizeOf(TNotifyIconData);
      Wnd    := Handle;
      uID    := 1;
      uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
      uCallBackMessage := MsgIcon;
      hIcon  := Application.Icon.Handle;
      szTip  := '提示';
   End;
End;

// 添加、修改、删除 系统区图标

Shell_NotifyIcon(NIM_ADD,   @NotifyIcon);
Shell_NotifyIcon(NIM_MODIFY,@NotifyIcon);
Shell_NotifyIcon(NIM_DELETE,@NotifyIcon);

// 重载消息处理过程(处理图标上发生的消息)

procedure TForm1.WndProc(var msg: TMessage);override;
Begin
   if msg.Msg=MsgTaskBarCreate then
      Shell_NotifyIcon(NIM_ADD,@NotifyIcon)

   if msg.Msg = MsgIcon then
   Begin
      case msg.LParam of
      WM_LBUTTONDown:
         begin
            // 处理鼠标左键按下
         end;
      WM_RBUTTONUp:
         begin
            // 处理鼠标右键放开,这里显示弹出菜单 PopupMenu1

            SetForegroundWindow(Handle);
            PopupMenu1.Popup(mouse.CursorPos.X,mouse.CursorPos.Y);
            SendMessage(0,0,0,0);
         end;
      end;
   End;

   inherited WndProc(Msg); // 调用父类处理所有消息
End;

6、手工发送图标消息

SendMessage(Handle, MsgIcon, uID, WM_LBUTTONUp);

DELPHI 实例:

var
  a : TcTrayIcon;

a := TcTrayIcon.Create(Handle, 0);
a.SetIcon(application.Icon.Handle);
a.SetText('tip','title','info');
a.ShowIcon;
 
 
if Assigned(a) then
  a.HideIcon;
// 下面是引用的文件
unit Unit2;
interface

uses windows,shellapi,sysutils;

type  NOTIFYICONDATAtc = 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; // As String * 256 气球提示文本
    uTimeoutOrVersion : DWORD;   // 气球提示消失时间或版本
                                 // uTimeout - 气球提示消失时间(单位:ms, 10000 -- 30000)
                                 // uVersion - 版本(0 for V4, 3 for V5)
    szInfoTitle : array[0..63] of AnsiChar; // String * 64  ' 气球提示标题
    dwInfoFlags : DWORD;         // 气球提示图标
end;


type TcTrayIcon = class
    Private
        icon : NOTIFYICONDATAtc ;
        trayiconshow : boolean;
        iconok, txtok : boolean;
    Public
        Constructor Create(hwnd:Cardinal;msg:Cardinal);
        Destructor Destroy; override;
        procedure ShowIcon();
        procedure UpdateIcon();
        procedure HideIcon();
        procedure SetIcon(iconhandle:LongWord);
        procedure SetText(tip,title,info:String);
    Published
        property IsShow:Boolean read TrayIconShow;
end;


implementation

uses dialogs,variants;

Constructor TcTrayIcon.Create(hwnd:Cardinal;msg:Cardinal) ;
begin
    trayiconshow := false;
    iconok := false;
    txtok := false;

    with icon do
    begin
        cbSize:=SizeOf(icon); // 结构大小
        Wnd:=hwnd;   //发送图标消息到此窗口
        uID:=1;        //图标标记,多个图标以此区别
        uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP or $10; // 需要哪些信息
        uCallBackMessage := msg ; //自定义消息,当图标有事件时,将发送此消息和相关事件Lparam
//        hIcon:=Application.Icon.Handle; // 图标句柄
//        szInfo:='点击这里隐藏';
//        szInfoTitle:='点歌台';
        dwInfoFlags:=1; // 气球图标 0 1 2 3
//        uTimeoutOrVersion := makelparam( 10000,0); // 气球时间
    end;
end;

Destructor TcTrayIcon.Destroy;
begin
    if self.trayiconshow then
        self.HideIcon ;
end;

// 显示系统栏图标
procedure TcTrayIcon.ShowIcon();
begin
    if not iconok or not txtok then exit;

    Shell_NotifyIcon(NIM_ADD, @icon );
    trayiconshow:=true;
end;

// 修改系统栏图标
procedure TcTrayIcon.UpdateIcon();
begin
    if self.trayiconshow then
    begin
        Shell_NotifyIcon(NIM_MODIFY,@icon);
    end;
end;

// 清除系统栏图标
procedure TcTrayIcon.HideIcon();
begin
   Shell_NotifyIcon(NIM_DELETE,@icon);
   TrayIconShow:=false;
end;

procedure TcTrayIcon.SetIcon(iconhandle:LongWord);
begin
    icon.hIcon:=IconHandle; // 图标句柄
    iconok := true;
    self.UpdateIcon ;
end;

procedure TcTrayIcon.SetText(tip,title,info:String);
begin
    strPCOPY(icon.szTip,tip) ;
    strPCOPY(icon.szInfoTitle, title);
    strPCOPY(icon.szInfo,info);
    txtok := true;
    self.UpdateIcon ;
end;

end.