| // uses ShellAPI
Type TNotifyIconData = record cbSize: DWORD; end; |
| 属性 | 意义 |
|---|---|
| cbSize | 结构尺寸,必须设为 Sizeof(TNotifyIconData) |
| Wnd | 图标消息发往的窗体 |
| uID | 图标号,多个图标以此区别,自定 |
| uFlags | 功能设置:(组合相加)
NIF_ICON 显示图标 |
| uCallbackMessage | 自定义消息号,必须在窗体中检测此消息 |
| hIcon | 图标 Handle, 一般取窗体的 Icon.Handle |
| szTip | 提示文字 Tip |
| function Shell_NotifyIcon(dwMessage: DWORD; lpData: PNotifyIconData): BOOL; |
| 属性 | 意义 |
|---|---|
| dwMessage | 功能选择:
NIM_ADD 添加图标 |
| lpData | 结构体指针 |
鼠标在图标上产生消息,回传到 TForm。
| Msg 属性 | 意义 |
|---|---|
| Msg | 消息 uCallbackMessage |
| wParam | 图标号 uID |
| lParam | 相关事件,如
M_LBUTTONDown WM_RBUTTONUp |
任务栏重建时,将发送此消息到每个窗口,窗口应捕获并重新显示图标。
| RegisterWindowMessage('TaskbarCreated'); |
| // 自定义一个消息代码并注册
Var Begin |
| // 定义 TNotifyIconData 结构体并初始化
Var Begin |
| // 添加、修改、删除 系统区图标
Shell_NotifyIcon(NIM_ADD, @NotifyIcon); |
| // 重载消息处理过程(处理图标上发生的消息)
procedure TForm1.WndProc(var msg: TMessage);override; if msg.Msg = MsgIcon then PopupMenu1.Popup(mouse.CursorPos.X,mouse.CursorPos.Y); SendMessage(0,0,0,0); end; end; End; inherited WndProc(Msg); // 调用父类处理所有消息 |
| SendMessage(Handle, MsgIcon, uID, WM_LBUTTONUp); |
| 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. |