问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎么使delphi小程序可以最小化到系统托盘?

发布网友 发布时间:2022-04-23 06:57

我来回答

2个回答

热心网友 时间:2022-06-17 03:13

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;
procere N1Click(Sender: TObject);
procere FormCreate(Sender: TObject);
procere FormDestroy(Sender: TObject);
procere FormClose(Sender: TObject; var Action: TCloseAction);
procere Timer1Timer(Sender: TObject);
private
procere modifyicon;
procere IconOnClick(var message: TMessage); MESSAGE MI_ICONEVENT;
procere 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}

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

procere 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;

procere 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;

procere 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;

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

procere 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;

procere 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;

procere 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.
最小化消息重载可以这样
procere pgame(var msg:twmsyscommand);message wm_syscommand;
procere Tmainfrm.pgame(var msg: twmsyscommand); //窗口最小化
begin
if msg.CmdType=SC_MINIMIZE then
begin
//处理代码
end;
inherited;
end;

热心网友 时间:2022-06-17 03:13

记得RXLIB控件库里有这个功能的控件,想学的话可以看下源码。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 黑客攻击报案有用吗 清洗汽车空调管道怎么清洗? 100分求Delphi小程序 求delphi小程序代码 我是菜鸟,使用delphi要编写一个每天零点就新建一个文本文件的小程序,不知道怎么解决?求助达人 Delphi小程序实例 同样如何用delphi编写一个无限循环的小程序? 求一delphi编写的小程序源码,能够运行会追加! 用Delphi怎样编写一个小程序可以实现几个程序按排列顺序每间隔5秒钟依次启动一个,谢谢! 用Delphi编写小程序。。~~~ 怎样用Delphi开发一个小程序? 请用Delphi编写一个小程序。全部分数悬赏 delphi怎么开发微信 怎样设置本机允许被远程连接? 用Delphi编写一个小程序 怎么设置本机硬盘启动 不是移动硬盘启动 如何设置本机的IP地址、子网掩码、默认网关、DNS服务器,备用DNS服务器... 怎么设置本机号码 本机设置在那里 如何设置本机的IP地址、子网掩码、默认网关和DNS服务器? 苹果怎么设置本机号码 写了个delphi的小程序,想在打开程序时输入密码,只需要输入密码,显示出来的是***,密码可以设置过期。 Delphi封装问题。一个小程序中,如何对一段代码进行封装,以便调用,减少代码量。最好给个例子。 delphi学的精通了,能做什么工作? 我做了个delphi小程式,要求逻辑删除,新手该怎么做???来个详细的逻辑删除代码吧!!!! delphi能开发什么呢? 在Delphi中,如何设置应用程序图标? 汽车空调系统堵塞,怎么判断是那里堵了,怎么清理 如何将文本文档格式转换为dat格式 文件文本格式转换 如何转换文本文件格式为电子书 文本文档和视频的格式怎么转化啊? 「堡垒之夜」四排配合技巧,四排怎么配合最好 怎么联机 堡垒之夜全平台联机方法一览 《堡垒之夜》2V2积分战怎么玩 2V2积分战规则介绍? 堡垒之夜怎么添加好友 堡垒之夜好友组队攻略 《堡垒之夜》手游怎么联机 堡垒之夜全平台联机方法 堡垒之夜按键新手怎么操作 堡垒之夜新手按键操作详解 堡垒之夜怎么联机 游戏联机技巧详细介绍 PC堡垒之夜怎么拉PS4好友联机啊 怎么召唤《堡垒之夜》队友?