DELPHI 系统托盘

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls,shellapi, Menus, AppEvnts,Registry;

const

mousemsg = wm_user + 1; //自定义消息,用于处理用户在图标上点击鼠标的事件

iid = 100; //用户自定义数值,在TnotifyIconDataA类型全局变量ntida中使用

type

TForm1 = class(TForm)

Button1: TButton;

PopupMenu1: TPopupMenu;

N1: TMenuItem;

ApplicationEvents1: TApplicationEvents;

procedure FormCreate(Sender: TObject);

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

procedure Button1Click(Sender: TObject);

procedure ApplicationEvents1Minimize(Sender: TObject);

procedure FormShow(Sender: TObject);

private

procedure mousemessage(var message: tmessage); message mousemsg;

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

ntida:TNotifyIcondataA; //用于增加和删除系统状态图标

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

begin

ntida.cbSize := sizeof(tnotifyicondataa); //指定ntida的长度

ntida.Wnd := handle; //取应用程序主窗体的句柄

ntida.uID := iid; //用户自定义的一个数值,在uCallbackMessage参数指定的消息中使

ntida.uFlags := nif_icon + nif_tip +

nif_message; //指定在该结构中uCallbackMessage、hIcon和szTip参数都有效

ntida.uCallbackMessage := mousemsg;

//指定的窗口消息

ntida.hIcon := Application.Icon.handle;

//指定系统状态栏显示应用程序的图标句柄

ntida.szTip := 'Icon';

//当鼠标停留在系统状态栏该图标上时,出现该提示信息

shell_notifyicona(NIM_ADD, @ntida);

//在系统状态栏增加一个新图标

end;

procedure TForm1.mousemessage(var message: tmessage);

var

mousept: TPoint; //鼠标点击位置

begin

inherited;

if message.LParam = wm_rbuttonup then begin //用鼠标右键点击图标

getcursorpos(mousept); //获取光标位置

popupmenu1.popup(mousept.x, mousept.y);

//在光标位置弹出选单

end;

if message.LParam = wm_lbuttonup then begin //用鼠标左键点击图标

//显示应用程序窗口

ShowWindow(Handle, SW_SHOW);

//在任务栏上显示应用程序窗口

ShowWindow(Application.handle, SW_SHOW);

SetWindowLong(Application.Handle, GWL_EXSTYLE,

not (GetWindowLong(Application.handle, GWL_EXSTYLE)

or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW));

end;

message.Result := 0;

end;

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

begin

Action := caNone; //不对窗体进行任何操作

ShowWindow(Handle, SW_HIDE); //隐藏主窗体

//隐藏应用程序窗口在任务栏上的显示

ShowWindow(Application.Handle, SW_HIDE);

SetWindowLong(Application.Handle, GWL_EXSTYLE,

not (GetWindowLong(Application.handle, GWL_EXSTYLE)

or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW));

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

ntida.cbSize := sizeof(tnotifyicondataa);

ntida.wnd := handle;

ntida.uID := iid;

ntida.uFlags := nif_icon + nif_tip + nif_message;

ntida.uCallbackMessage := mousemsg;

ntida.hIcon := Application.Icon.handle;

ntida.szTip := 'Icon';

shell_notifyicona(NIM_DELETE, @ntida);

//删除已有的应用程序图标

Application.Terminate;

//中断应用程序运行,退出应用程序

end;

end

然后详细说明下具体实现方法

1、在user处添家一个“ShellAPI”,这样就可以代用这个API了,如:。

uses

Windows, Messages,...., shellapi;

2、声明两个常量

const

mousemsg = wm_user + 1; //自定义消息,用于处理用户在图标上点击鼠标的事件

iid = 100; //用户自定义数值,在TnotifyIconDataA类型全局变量ntida中使用

3、声明一个函数

procedure mousemessage(var message: tmessage); message mousemsg;

4、声明一个变量

ntida:TNotifyIcondataA; //用于增加和删除系统状态图标