托盘图标相关

来源:互联网 发布:淘宝office2016激活 编辑:程序博客网 时间:2024/04/30 09:13

核心内容是 Shell_32.Dll 中的Shell_NotifyIcon函数.

Shell_NotifyIcon函数,向任务栏的状态栏发送一个消息

函数原型

  BOOL Shell_NotifyIcon(

  DWORD dwMessage,

  PNOTIFYICONDATA lpdata (Delphi中的TNotifyIconData的地址)

  );

  参数:

  dwMessage为输入参数,传递发送的消息,表明要执行的操作。可选的值如下:

  NIM_ADD

  向托盘区域添加一个图标。此时第二个参数lpdata指向的NOTIFYICONDATA结构体中的hWnduID成员用来标示这个图标,以便以后再次使用Shell_NotifyIcon对此图标操作。

  NIM_DELETE

  删除托盘区域的一个图标。此时第二个参数lpdata指向的NOTIFYICONDATA结构体中的hWnduID成员用来标示需要被删除的这个图标。

  NIM_MODIFY

  修改托盘区域的一个图标。此时第二个参数lpdata指向的NOTIFYICONDATA结构体中的hWnduID成员用来标示需要被修改的这个图标。

  NIM_SETFOCUS

  Version 5.0. 设置焦点。比如当用户操作托盘图标弹出菜单,而有按下ESC键将菜单消除后,程序应该使用此消息来将焦点设置到托盘图标上。

  NIM_SETVERSION

  Version 5.0. 设置任务栏按照第二个参数lpdata指向的NOTIFYICONDATA结构体中的uVersion成员指定的版本号来工作。此消息可以允许用户设置是否使用基于Windows2000version 5.0的风格。uVersion的缺省值为0,默认指明了使用原始Windows 95图标消息风格。具体这两者的区别请参考msdn中的Shell_NotifyIcon函数说明的Remarks

  lpdata为输入参数,是指向NOTIFYICONDATA结构体的指针,结构体内容用来配合第一个参数wMessage进行图标操作。

  如果图标操作成功返回TRUE,否则返回FALSE

  如果dwMessage参数设为NIM_SETVERSION,则如果版本设置成功返回TRUE,如果设置的版本不支持返回FALSE


TNotifyIconData
详解

      TNotifyIconData是一个记录类型,按住Ctrl键,在TNotifyIconData   双击即进入ShellAPI.pas单元【注意加入引用】。(注:在Delphi中,这是一个非常好的对源代码进行分析的方法,源代码说明一切,你要想知道程序背后的内幕,最好的方法就是分析源代码!)此时出现了以下赋值语句:   

TNotifyIconData   =   TNotifyIconDataA;
TNotifyIconDataA   =   _NOTIFYICONDATAA;

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

详细介绍:
         cbSize
就是你定义的NotifyIcon变量的大小,用SizeOf(TNotifyIconData)可以取得,如果你是一个熟练的C/C++程序员,你应该不会陌生。在C/C++中,每当要为一个结构体变量分配内存的时候都要:通过   SizeOf(Struct   type)   来获知存放一个这样的结构体变量要多少内存。   

         Wnd
是一个句柄,你希望托盘程序产生的消息有哪个窗体来处理就让Wnd指向那个窗体。例如:你准备在任务栏的托盘小图标上单击时窗体是窗体在显示隐藏之间切换,则把Wnd指向主窗体。   

          uID:
如果你要创建多个托盘小程序,那么怎么区分它们呢?就是靠这个ID号来区分。   

          uFlags
是一个标志位,它表示当前所创建的托盘程序具有哪些性质:   
                NIF_ICON                    
表示当前所设置的图标(即hIcon的值)是有效的     
                NIF_MESSAGE    
表示当前所设置的系统消息(即uCallBackMessage的值)是有效的   
                NIF_TIP                    
表示当前所设置的提示条(即szTip的值)是有效的。   

          uCallBackMessage
这是7个部分里面最重要的一个。这里指定一个回调消息,也就是说这里定义一个消息名,当你单击或者右击托盘图标的时候就会向你在Wnd所指向的窗体发送一个在uCallBackMessage中定义的消息名,然后你在程序中定义一个消息出来函数来处理这个消息。这样就把 Windows关于消息的整套流程都处理好了。     

          hIcon
为托盘图标的句柄,根据这个句柄你就可以增加、修改、删除图标。   
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

          szTip就是当你的鼠标放到任务栏托盘的小图标上的时候弹出来的提示信息。   
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

NotifyIcon定义示例:

 With  NotifyIcon   do  

 begin  
  cbSize:=SizeOf(TNotifyIconData);  
  Wnd:=Handle;       //
指向当前窗体Form1的句柄  
  uID:=1;  
  uFlags:=NIF_ICON   or   NIF_MESSAGE   or   NIF_TIP;  
  uCallBackMessage:=MY_MSG;     //
自定义类型  MY_MSG = WM_USER + 1;//小于WM_USERwindows占用,大于为自定义 
  hIcon:=Application.Icon.Handle;  
  szTip:= 'Test'; 
end;
  
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

关联鼠标点击等事件

       Form结构中声明procedure   WMNID(var   msg:TMessage);message  WM_NID;  //声明后加消息名表示当系统发来此消息时自动触发该进程.

procedure   TForm1.WMNID(var   msg:TMessage); 

var
  mypt:Tpoint;
begin  
case   msg.LParam   of  
    WM_LBUTTONUp:   Form1.Visible:=not   Form1.Visible;  
    WM_RBUTTONUP:  

       begin

           ShowMessage('您点击的是右键'); 

           GetCursorPos(mypt);
           PopupMenu1.Popup(mypt.X, mypt.Y);       //
弹出右键菜单
        end;
End;
  


<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->


<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->