你要的就是这个<br>没错的<br><br><br>{uses中加入 shellapi<br>File->New Applicaton 在Interface部分定义一个消息常量:const WM_NID=WM_USER+1000; 系统规定从WM_USER开始为用户自定义消息。<br>定义一个全局变量: NotifyIcon:TNotifyIconData,NotifyIcon是非常重要的一个变量,整个程序基本上是围着这个变量在转。TNotifyIconData是一个记录类型,按住Ctrl键,在TNotifyIconData 双击即进入ShellAPI.pas单元。(注:在Delphi中,这是一个非常好的对源代码进行分析的方法,源代码说明一切,你要想知道程序背后的内幕,最好的方法就是分析源代码!)此时出现了以下赋值语句:<br> TNotifyIconData = TNotifyIconDataA,这个意思很明显,就是说TNotifyIconData和TNotifyIconDataA是同种数据类型,接着往下看有:<br>TNotifyIconDataA = _NOTIFYICONDATAA,意思与刚才的一样,再往下看:<br>type<br>_NOTIFYICONDATAA = record<br>cbSize: DWORD;<br>Wnd: HWND;<br>uID: UINT;<br>uFlags: UINT;<br>uCallbackMessage: UINT;<br>hIcon: HICON;<br>szTip: array [0..63] of AnsiChar;<br>end;<br> 这可真是“千呼万唤始出来,犹抱琵琶半遮面”。现在大家很清楚了,我们刚才定义的全局变量NotifyIcon其实是一个包含有7个成分的记录类型变量,就相当于C/C++中的结构体变量(C/C++的程序员应该是再熟悉不过了)。下面我们逐个来解释记录类型中的7个部分各有什么功能。<br> 1> cbSize就是你定义的NotifyIcon变量的大小,用SizeOf(TNotifyIconData)可以取得,如果你是一个熟练的C/C++程序员,你应该不会陌生。在C/C++中,每当要为一个结构体变量分配内存的时候都要:通过 SizeOf(Struct type) 来获知存放一个这样的结构体变量要多少内存。<br> 2> Wnd是一个句柄,你希望托盘程序产生的消息有哪个窗体来处理就让Wnd指向那个窗体。<br> 例如:你准备在任务栏的托盘小图标上单击时窗体是窗体在“显示”和“隐藏”之间切换,则把Wnd指向主窗体。<br> 3> uID:如果你要创建多个托盘小程序,那么怎么区分它们呢?就是靠这个ID号来区分。<br> 4> uFlags是一个标志位,它表示当前所创建的托盘程序具有哪些性质:<br> NIF_ICON 表示当前所设置的图标(即hIcon的值)是有效的<br> NIF_MESSAGE 表示当前所设置的系统消息(即uCallBackMessage的值)是有效的<br> NIF_TIP 表示当前所设置的提示条(即szTip的值)是有效的。<br> 5> uCallBackMessage这是7个部分里面最重要的一个。这里指定一个回调消息,也就是说这里定义一个消息名,当你单击或者右击托盘图标的时候就会向你在Wnd所指向的窗体发送一个在uCallBackMessage中定义的消息名,然后你在程序中定义一个消息出来函数来处理这个消息。这样就把Windows关于消息的整套流程都处理好了。<br> 6> hIcon为托盘图标的句柄,根据这个句柄你就可以增加、修改、删除图标。<br> 7> szTip就是当你的鼠标放到任务栏托盘的小图标上的时候弹出来的提示信息。}<br>unit Unit1;<br><br>interface<br><br><br>uses<br> Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br> Dialogs,shellapi, StdCtrls, Menus;<br> const<br>WM_NID=WM_USER+1000; //定义一个消息常量 ,<br> //系统规定从WM_USER开始为用户自定义消息<br><br>type<br> TForm1 = class(TForm)<br> PopupMenu1: TPopupMenu;<br> N1: TMenuItem;<br> Label1: TLabel;<br> procedure FormDestroy(Sender: TObject);<br> procedure installicon;<br> procedure N1Click(Sender: TObject);<br> procedure FormShow(Sender: TObject);<br><br> private<br>procedure IconOnClick(var message:TMessage); message WM_NID;<br>//自定义mouse的click事件<br>procedure WMSysCommand(var Message: TMessage); message WM_SYSCOMMAND;<br>//截获 WM_SYSCOMMAND消息,看窗体是否处于最小化状态<br> public<br><br> end;<br><br>var<br> Form1: TForm1;<br> NotifyIcon:TNotifyIconData;//NotifyIcon是非常重要的一个变量,<br> //整个程序基本上是围着这个变量在转。<br> //TNotifyIconData是一个记录类型<br><br>implementation<br><br>{$R *.dfm}<br>procedure TForm1.WMSysCommand(var Message:TMessage);<br>begin<br>if Message.WParam = SC_ICON then //最小化了<br>begin<br>form1.hide;<br>installicon;<br>end<br>else<br>inherited;<br>end;<br><br><br>procedure TForm1.FormDestroy(Sender: TObject);<br>begin<br>Shell_NotifyIcon(NIM_DELETE,@NotifyIcon); //从任务栏删除图标<br>end;<br><br><br>procedure TForm1.installicon;<br>begin<br>application.ShowMainForm:=false;<br>//SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);<br>//上面的函数可以和application一样用。但是只隐藏任务栏<br>//NotifyIcon为全局变量,在程序的开头已经定义了<br>with NotifyIcon do<br>begin<br>cbSize:=SizeOf(TNotifyIconData);<br>Wnd:=Handle; //指向当前窗体Form1的句柄<br>uID:=1;<br>uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;<br>uCallBackMessage:=WM_NID;<br>hIcon:=Application.Icon.Handle;<br>szTip:='任务栏演示程序';<br>end;<br>//把设置好的变量NotifyIcon加入到系统中以便处理<br>Shell_NotifyIcon(NIM_ADD,@NotifyIcon);<br>end;<br><br><br>procedure TForm1.IconOnClick(var message:TMessage); <br>//处理鼠标在指示状态栏对应的图标上的单击事件 <br>var <br> p:TPoint; <br>begin <br> //如果按下的是鼠标左键,并且允许显示,则显示Form2 <br> if message.lParam=WM_LBUTTONDOWN then<br> Form1.Show;<br> //如果按下的是鼠标右键,则显示弹出菜单 <br> if(message.lParam=WM_RBUTTONDOWN)then <br> begin<br><br> GetCursorPos(p);<br> PopupMenu1.Popup(p.x,p.y);<br> end; <br>end;<br><br>procedure TForm1.N1Click(Sender: TObject);<br>begin<br>form1.Show;<br>end;<br><br>procedure TForm1.FormShow(Sender: TObject);<br>begin<br>showwindow(application.Handle,SW_SHOWNA);<br>Shell_NotifyIcon(NIM_DELETE,@NotifyIcon);<br>end;<br><br>end.<br> <br><br>+分~