// 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. |