Delphi 添加系统托盘

来源:互联网 发布:lemon incest知乎 编辑:程序博客网 时间:2024/06/05 05:02

一、  基础知识介绍:  

NIData:TNotifyIconData,NIData是非常重要的一个变量,整个程序基本上是围着这个变量在转(uses ShellAPI)。

1>、 TNotifyIconData是一个记录类型(相对于结构体变量)。

// TNotifyIconData和TNotifyIconDataA, _NOTIFYICONDATAA是同种数据类型,
TNotifyIconData   =   TNotifyIconDataA, 
TNotifyIconDataA   =   _NOTIFYICONDATAA,    
type  
_NOTIFYICONDATAA   =   record   
cbSize: DWORD; // cbSizes是NIData变量的大小,用SizeOf(TNotifyIconData)可以取得;
Wnd:   HWND; // Wnd是一个句柄,指向消息处理的窗体。
uID:   UINT;   // uID:创建多个托盘小程序时,考ID号来区分。  
uFlags:   UINT; // uFlags是一个标志位,它表示当前所创建的托盘程序具有哪些性质:
uCallbackMessage:   UINT;  
hIcon:   HICON; // hIcon为托盘图标的句柄,根据句柄可以增加、修改、删除图标。
// szTip就是当你的鼠标放到任务栏托盘的小图标上的时候弹出来的提示信息。
szTip:   array   [0..63]   of   AnsiChar;  
end;  

 

2>、uFlags是一个标志位,它表示当前所创建的托盘程序具有哪些性质:  

NIF_ICON     表示当前所设置的图标(即hIcon的值)是有效的    
NIF_MESSAGE 表示当前所设置的系统消息(即uCallBackMessage的值)是有效的  
NIF_TIP       表示当前所设置的提示条(即szTip的值)是有效的。  

 

3>、uCallBackMessage这是7个部分里面最重要的一个。这里指定一个回调消息,也就是说

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

二、创建系统托盘的具体步骤

 1.  新建一个应用程序:

      File->New   Applicaton   在Interface部分(全局的)的uses之后,必须定义一个消息常量:const   WM_TRAYICON =WM_USER+1000; windows消息规定从WM_USER开始为用户自定义消息。Project->Options,选中Application页面,在Icon项中加载自己喜欢的图标。

定义全局变量:// 如果不定义成全局变量,系统退出时,系统托盘处还是会显示图标。

var

  NIData: TNotifyIconData;

 

2.  定义一个函数,用于操作系统托盘:

procedure TForm1.ModifyTrayIcon(Action: DWORD);//Action 为托盘的操作类型

begin

  with NIData do

  begin

    cbSize := sizeof(TNotifyIconData);

    UID := 0;

    uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;

    Wnd := Handle;   //指向当前窗体Form1的句柄   

    uCallBackMessage := WM_TRAYICON;// 对系统托盘区返回的信息进行处理的函数。

    HICON := Application.Icon.Handle;// 托盘的图标

    StrPCopy(szTip, Application.Title); // 托盘的提升信息

  end;

  //把设置好的变量NotifyIcon按传入的操作类型进行处理  

  Shell_NotifyIcon(Action, @NIData);

end;    

3.  定义一个消息处理函数

系统给窗体发来了一个消息,就由下面这个函数来处理,每个消息处理函数都是处

理某一类消息的,消息处理函数要在后面加上消息的名称,这样当系统发来WM_TRAYICON

消息时,就是自动触发WM_TRAYICON消息处理函数(Delphi 消息处理技术)。  

声明:procedure WMTrayIcon(var message: TMessage); message WM_TRAYICON;

实现:procedure TForm1.WMTrayIcon(var message: TMessage);

var

  MousePos: TPoint;

Begin

  //判断是否是右击事件,是就显示右击菜单栏

  if message.LPARAM = WM_RBUTTONDOWN then

  begin

    SetActiveWindow(Handle); //该函数激活一个窗口。

    GetCursorPos(MousePos);

    PopupMenu.Popup(MousePos.X, MousePos.Y); //显示右击菜单栏  PopupMenu 右击菜单的名字

  end;

end;

4.  建立托盘程序,进入FormCreate的代码区域:  

procedure TForm1.FormCreate(Sender: TObject);

begin

  ModifyTrayIcon(NIM_ADD);

end;

5.  释放托盘程序,在FormClose的代码区域,否则会占用系统资源。

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

  ModifyTrayIcon(NIM_DELETE);

end;  

6.  全部代码

[delphi] view plaincopy
  1. unit Unit1;  
  2.   
  3.    
  4.   
  5. interface  
  6.   
  7.    
  8.   
  9. uses  
  10.   
  11.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  
  12.   
  13.   ShellAPI, Menus, StdCtrls;  
  14.   
  15.    
  16.   
  17. const  
  18.   
  19.   WM_TRAYICON = WM_APP + 0;  
  20.   
  21. type  
  22.   
  23.   TForm1 = class(TForm)  
  24.   
  25.     PopupMenu: TPopupMenu;  
  26.   
  27.     Hello1: TMenuItem;  
  28.   
  29.     Exit1: TMenuItem;  
  30.   
  31.     N1: TMenuItem;  
  32.   
  33.     There1: TMenuItem;  
  34.   
  35.     Label1: TLabel;  
  36.   
  37.     procedure FormClose(Sender: TObject; var Action: TCloseAction);  
  38.   
  39.     procedure FormCreate(Sender: TObject);  
  40.   
  41.     procedure Exit1Click(Sender: TObject);  
  42.   
  43.   private  
  44.   
  45.     procedure WMTrayIcon(var message: TMessage); message WM_TRAYICON;  
  46.   
  47.     procedure ModifyTrayIcon(Action: DWORD);  
  48.   
  49.   public  
  50.   
  51.   end;  
  52.   
  53.     
  54.   
  55. var  
  56.   
  57.   Form1: TForm1;  
  58.  NIData: TNotifyIconData;  
  59.     
  60.   
  61. implementation  
  62.   
  63.    
  64.   
  65. {$R *.DFM}  
  66.   
  67.    
  68.   
  69. procedure TForm1.ModifyTrayIcon(Action: DWORD);  
  70.   
  71. begin  
  72.   
  73.   with NIData do  
  74.   
  75.   begin  
  76.   
  77.     cbSize := sizeof(TNotifyIconData);  
  78.   
  79.     uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;  
  80.   
  81.     Wnd := Handle;  
  82.   
  83.     uCallBackMessage := WM_TRAYICON;  
  84.   
  85.      
  86.   
  87.     HICON := Application.Icon.Handle;  
  88.   
  89.     
  90.   
  91.     StrPCopy(szTip, Application.Title);  
  92.   
  93.   end;  
  94.   
  95.   Shell_NotifyIcon(Action, @NIData);  
  96.   
  97. end;  
  98.   
  99.    
  100.   
  101. procedure TForm1.WMTrayIcon(var message: TMessage);  
  102.   
  103. var  
  104.   
  105.   MousePos: TPoint;  
  106.   
  107. begin  
  108.   
  109.   if message.LPARAM = WM_RBUTTONDOWN then  
  110.   
  111.   begin  
  112.   
  113.     SetActiveWindow(Handle);  
  114.   
  115.     GetCursorPos(MousePos);  
  116.   
  117.     PopupMenu.Popup(MousePos.X, MousePos.Y);  
  118.   
  119.   end;  
  120.   
  121. end;  
  122.   
  123.    
  124.   
  125. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);  
  126.   
  127. begin  
  128.   
  129.   ModifyTrayIcon(NIM_DELETE);  
  130.   
  131. end;  
  132.   
  133.    
  134.   
  135. procedure TForm1.FormCreate(Sender: TObject);  
  136.   
  137. begin  
  138.   
  139.   ModifyTrayIcon(NIM_ADD);  
  140.   
  141. end;  
  142.   
  143.    
  144.   
  145. procedure TForm1.Exit1Click(Sender: TObject);  
  146.   
  147. begin  
  148.   
  149.   Close;  
  150.   
  151. end;  
  152.   
  153.    
  154.   
  155. end
0 0