delphi 关闭时缩小到托盘_怎么使delphi小程序可以最小化到系统托盘?

这篇博客介绍了如何利用Shell_NotifyIcon API在Delphi程序中实现窗口关闭时缩小到系统托盘的功能。通过创建托盘图标,设置自定义消息,以及处理窗口最小化事件,使得程序能够在任务栏右下角显示并交互。
摘要由CSDN通过智能技术生成

Shell_NotifyIcon这个API可以实现系统托盘图标功能,然后你在自定义一下最小化的消息就可以了,图标功能有个例子

托盘就是在任务栏右下角的小图标。创建、更改、删除只需要一个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.

最小化消息重载可以这样

procedure pgame(var msg:twmsyscommand);message wm_syscommand;

procedure Tmainfrm.pgame(var msg: twmsyscommand); //窗口最小化

begin

if msg.CmdType=SC_MINIMIZE then

begin

//处理代码

end;

inherited;

end;

◆◆

评论读取中....

请登录后再发表评论!

◆◆

修改失败,请稍后尝试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值