Shell_NotifyIcon函数新特性---Balloon Tips之深入研究[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 happyjoe 的 blog

首先定义新的常数:
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 时间到时执行}

本文关键:Shell_NotifyIcon, Icon, SysTray, SysTrayIcon, Notification Area, 托盘
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top