使用delphi消息处理机制实现托盘图标

托盘就是在任务栏右下角的小图标。创建、更改、删除只需要一个Windows API就能实现。这个函数叫做Shell_NotifyIcon()。这个函数和其他处理Windows 外壳的函数都包含在ShellAPI单元中。本例程在窗口创建时在任务栏的右下角创建一个托盘图标。图标由两个ICON交替出现。当窗口最小化时任务栏中只有托盘图标,当左键单击托盘图标窗口恢复。图标停止交替。


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,SHELLAPI,
  Menus, Dialogs,
  ExtCtrls, ImgList;
  const
 MI_ICONEVENT = WM_USER + 1;
 ICON_ID = 10;
type
    TForm1 = class(TForm)
    Timer1: TTimer;
    PopupMenu2: TPopupMenu;
    N1: TMenuItem;
    ImageList1: TImageList;
    procedure N1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Timer1Timer(Sender: TObject);
  private
   procedure modifyicon;
   procedure IconOnClick(var message: TMessage); MESSAGE MI_ICONEVENT;
   procedure tranmessage(var m:TWMSYSCOMMAND); message WM_SYSCOMMAND;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  ydic:array [0..1] of ticon;
  icint:integer;
   xsyc:BOOLEAN;
implementation

{$R *.DFM}

procedure TForm1.N1Click(Sender: TObject);
begin
APPLICATION.Terminate ;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  IconData: TNotifyIconData;

begin
   xsyc:=true;
   ydic[0]:=ticon.Create;
   ydic[1]:=ticon.Create;
   ydic[0].Handle :=loadicon(hinstance,'icon0');//资源文件(ICONS.RES)
   ydic[1].Handle :=loadicon(hinstance,'icon1');
   IconData.cbSize:=SizeOf(IconData );
   IconData.Wnd:= form1.Handle;
   IconData.uID:= ICON_ID;
   IconData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
   IconData.uCallBackMessage := MI_ICONEVENT;
   IconData.hIcon :=ydic[0].Handle;
   IconData.szTip := '我笑、我笑、笑笑笑';
   icint:=0;
   Shell_NotifyIcon( NIM_ADD, @IconData );
   ShowWindow(Application.Handle, SW_HIDE );


end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  IconData: TNotifyIconData;
begin //卸载图标
     IconData.cbSize := SizeOf( IconData );
     IconData.Wnd :=form1.Handle;
     IconData.uID := ICON_ID;
     Shell_NotifyIcon( NIM_DELETE, @IconData );

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  IconData: TNotifyIconData;
begin //卸载图标
     IconData.cbSize := SizeOf( IconData );
     IconData.Wnd :=form1.Handle;
     IconData.uID := ICON_ID;
     Shell_NotifyIcon( NIM_DELETE, @IconData );
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  modifyicon
end;

procedure TForm1.modifyicon;
var
  IconData: TNotifyIconData;
begin
     IconData.cbSize := SizeOf( IconData );
     IconData.Wnd :=form1.Handle;
     IconData.uID := ICON_ID;
     icint:=(icint+1) mod 2;
     IconData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
     IconData.uCallBackMessage := MI_ICONEVENT;
     icondata.hIcon:= ydic[icint].Handle;
     IconData.szTip := '我笑、我笑、笑笑笑';
     shell_notifyicon(nim_modify,@icondata);

end;

procedure TForm1.IconOnClick(var message: TMessage);
var
   a:tpoint;
begin //单击事件
     if (message.lParam = WM_RBUTTONDOWN) then
     begin
          getcursorpos(a);
          PopupMenu2.Popup(a.x,a.y);
     end
     else if (message.lParam = WM_LBUTTONDOWN) then
     begin
      timer1.Enabled:=FALSE;
          if xsyc then
          sendmessage(form1.Handle,wm_syscommand,sc_minimize,0)
          else
          begin
               ShowWindow(Application.Handle,SW_RESTORE);//SW_maximize
               setforegroundwindow(form1.handle);
               xsyc:=true;
          end;
     end;


end;

procedure TForm1.tranmessage(var m: TWMSYSCOMMAND);
begin
 if m.CmdType=SC_MINIMIZE then
     begin
        timer1.Enabled :=true;
                      sendmessage(Application.Handle,WM_SYSCOMMAND,SC_MINimize,0);
          ShowWindow(Application.Handle, SW_HIDE );
          xsyc:=false;
     end
     else
     inherited;
end;

end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值