首先定义新的常数:
const
nif_info = $10;
nim_setversion = $00000004;
notifyicon_version = 3;
nim_setfocus = $00000003;
niif_info = $00000001;
niif_warning = $00000002;
niif_error = $00000003;
nin_balloonshow = wm_user + 2;
nin_balloonhide = wm_user + 3;
nin_balloontimeout = wm_user + 4;
nin_balloonuserclick = wm_user + 5;
nin_select = wm_user + 0;
ninf_key = $1;
nin_keyselect = nin_select or ninf_key;
{上面列的可能不全,如果没有定义到的,可在 vs.net 中 vc7 中的 platformsdk\include\shellapi.h 中找到}
再定义一个systrayicon的回传消息:
tray_callback = wm_user + $7258;
然后定义新的 notifyicondata 结构(放在type中):
type
pnewnotifyicondata = ^tnewnotifyicondata;
tdummyunionname = record
case integer of
0: (utimeout: uint);
1: (uversion: uint);
end;
tnewnotifyicondata = record
cbsize: dword;
wnd: hwnd;
uid: uint;
uflags: uint;
ucallbackmessage: uint;
hicon: hicon;
sztip: array [0..127] of char; //version 5.0为128个,以前为64个
dwstate: dword; //version 5.0
dwstatemask: dword; //version 5.0
szinfo: array [0..255] of char; //version 5.0
dummyunionname: tdummyunionname;
szinfotitle: array [0..63] of char; //version 5.0
dwinfoflags: dword; //version 5.0
end;
声明一个全局变量:
var
icondata: tnewnotifyicondata;
接着转入正题,下面一个过程用来添加 systrayicon :
procedure addsystrayicon;
begin
icondata.cbsize := sizeof(icondata);
icondata.wnd := allocatehwnd(systrayiconmsghandler); //self.handle; {systrayiconmsghandler 为后面定义的消息处理过程}
icondata.uid := 0;
icondata.uflags := nif_icon or nif_message or nif_tip;
icondata.ucallbackmessage := tray_callback; //自定义回传消息
icondata.hicon := image1.picture.icon.handle; //此处为一 icon 的 handle
icondata.sztip := 'please send me email.';
if not shell_notifyicon(nim_add, @icondata) then
showmessage('add fail');
end;
再有一个过程用来显示 balloon tips :
procedure showballoontips;
var
tipinfo, tiptitle: string;
begin
icondata.cbsize := sizeof(icondata);
icondata.uflags := nif_info;
tipinfo := 'please send me email.';
strplcopy(icondata.szinfo, tipinfo, sizeof(icondata.szinfo) - 1);
icondata.dummyunionname.utimeout := 3000;
tiptitle := 'happyjoe@21cn.com';
strplcopy(icondata.szinfotitle, tiptitle, sizeof(icondata.szinfotitle) - 1);
icondata.dwinfoflags := niif_info; //niif_error; //niif_warning;
shell_notifyicon(nim_modify, @icondata);
//下面的代码实际上没有用,去掉也可以(至少目前这样认为)
icondata.dummyunionname.uversion := notifyicon_version;
if not shell_notifyicon(nim_setversion, @icondata) then
showmessage('setversion fail');
end;
别忘了删除过程:
procedure deletesystrayicon;
begin
deallocatehwnd(icondata.wnd);
if not shell_notifyicon(nim_delete, @icondata) then
showmessage('delete fail');
end;
还有重要的环节---消息处理:
声明:
procedure systrayiconmsghandler(var msg: tmessage); message tray_callback;
定义:
procedure systrayiconmsghandler(var msg: tmessage);
begin
case msg.lparam of
wm_mousemove: ;
wm_lbuttondown: ;
wm_lbuttonup: ;
wm_lbuttondblclk: ;
wm_rbuttondown: ;
wm_rbuttonup: ;
wm_rbuttondblclk: ;
//以下为新加入的消息
nin_balloonshow: {当 balloon tips 弹出时执行}
showmessage('nin_balloonshow');
nin_balloonhide: {当 balloon tips 消失时执行(例如 systrayicon 被删除),但指定的 timeout 时间到或鼠标点击 balloon tips 后的消失不发送此消息}
showmessage('nin_balloonhide');
nin_balloontimeout: {当 balloon tips 的 timeout 时间到时执行}