delphi怎么写“最小化到系统托盘”(有控件最好)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi怎么写“最小化到系统托盘”(有控件最好)相关的知识,希望对你有一定的参考价值。

请直接贴源码

能有控件最好了,附上下载地址

另外,BS或者是DS(SP)皮肤上的 minimize to tray 为什么会无效?

我已经将它赋值成true了,还需要些什么代码吗?还是我操作不对?

最好两个问题一并回答,不定时追分

Thanks

uses ShellAPI;
const
MY_MESSAGE=WM_USER+100;
public
Public declarations
procedure proOnIconNotify(var MyMeg:TMessage);message MY_MESSAGE;
procedure TfrmTimer.FormCreate(Sender: TObject);
var
nid:TNotifyIconData;
begin
SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW); //不在任务栏显示
//创建系统托盘图标开始
nid.cbSize:=sizeof(nid); //nid变量的字节数
nid.Wnd:=Handle; //主窗口句柄
nid.uID:=1; //内部标识,可设为任意数,但删除时应保持一致
nid.hIcon:=Application.Icon.Handle; //要加入的图标句柄,可任意指
nid.szTip:=\'定时启动器\'; //提示字符串
nid.uCallbackMessage:=MY_MESSAGE; //回调函数消息
nid.uFlags:=NIF_ICON or NIF_TIP or NIF_MESSAGE; //指明哪些字段有
if not Shell_NotifyIcon(NIM_ADD,@nid)then
MessageBox(handle,\'创建系统托盘图标失败!\',\'错误\',MB_ICONHAND + MB_OK);
//创建系统托盘图标结束
end;
procedure TfrmTimer.FormDestroy(Sender: TObject);
var
nid:TNotifyIconData;
begin
//删除系统托盘图标 开始
nid.cbSize:=sizeof(nid); //nid变量的字节数
nid.cbSize:=sizeof(nid); //nid变量的字节数
nid.uID:=1; //内部标识,与加入小图标时的数一致
nid.Wnd:=Handle; //主窗口句柄
Shell_NotifyIcon(NIM_DELETE,@nid); //去掉小图标
//删除系统托盘图标 结束
end;
procedure TfrmTimer.FormActivate(Sender: TObject);
begin
SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_APPWINDOW); //在任务栏显示
end;
procedure TfrmTimer.proOnIconNotify(var MyMeg:TMessage);
begin
Case MyMeg.LParam of
WM_LBUTTONDBLCLK,WM_RBUTTONDOWN,WM_LBUTTONDOWN:
frmTimer.Show;
end;
end;

uses ShellAPI;
const
MY_MESSAGE=WM_USER+100;
public
Public declarations
//点击系统托盘图标事件
procedure proOnIconNotify(var MyMeg:TMessage);message MY_MESSAGE;
procedure TfrmTimer.FormCreate(Sender: TObject);
var
nid:TNotifyIconData;
begin
SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW); //不在任务栏显示
//创建系统托盘图标开始
nid.cbSize:=sizeof(nid); //nid变量的字节数
nid.Wnd:=Handle; //主窗口句柄
nid.uID:=1; //内部标识,可设为任意数,但删除时应保持一致
nid.hIcon:=Application.Icon.Handle; //要加入的图标句柄,可任意指
nid.szTip:=\'定时启动器\'; //提示字符串
nid.uCallbackMessage:=MY_MESSAGE; //回调函数消息
nid.uFlags:=NIF_ICON or NIF_TIP or NIF_MESSAGE; //指明哪些字段有
if not Shell_NotifyIcon(NIM_ADD,@nid)then
MessageBox(handle,\'创建系统托盘图标失败!\',\'错误\',MB_ICONHAND + MB_OK);
//创建系统托盘图标结束
end;
procedure TfrmTimer.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if(xPlanCount<1)then
proSvLog(\'程序关闭。\')
else
begin
if(MessageBox(handle,\'关闭程序将清理所有的定时启动任务,是否确认关闭?\',\'注意\',MB_YESNO+MB_ICONINFORMATION)=ID_NO)then
begin
Action:=caNone;
exit;
end;
Hide();
proSvLog(\'程序将关闭,开始清理线程!\');
while(xPlanCount>0)do
begin
proDelPlan(StrToInt(sgList.Cells[0,xPlanCount]));
end;
while(xTHreadCount>0)do
begin
Application.ProcessMessages;//解决循环独占问题以响应外部事件
end;
proSvLog(\'线程清理完成,程序关闭!\');
end;
end;
procedure TfrmTimer.FormDestroy(Sender: TObject);
var
nid:TNotifyIconData;
begin
//删除系统托盘图标 开始
nid.cbSize:=sizeof(nid); //nid变量的字节数
nid.cbSize:=sizeof(nid); //nid变量的字节数
nid.uID:=1; //内部标识,与加入小图标时的数一致
nid.Wnd:=Handle; //主窗口句柄
Shell_NotifyIcon(NIM_DELETE,@nid); //去掉小图标
//删除系统托盘图标 结束
end;
procedure TfrmTimer.FormActivate(Sender: TObject);
begin
SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_APPWINDOW); //在任务栏显示
end;
procedure TfrmTimer.proOnIconNotify(var MyMeg:TMessage);//点击系统图标事件
begin
Case MyMeg.LParam of
WM_LBUTTONDBLCLK,WM_RBUTTONDOWN,WM_LBUTTONDOWN:
frmTimer.Show;
end;
end;

 

formClose()事件的代码直接无视吧,这个插代码的功能用着一肚子火。

第二个问题不懂,帮不了你

参考技术A 要源码的话,我可以帮你写一个。 不过你最好还是看看我说的,然后自己去写吧。

1、在程序最小化的时候,不显示在任务栏,这个可以用很多方法,比如ShowWindow = false。 这样就不显示了。

2、在托盘增加图标。定义一个全局变量: NotifyIcon:TNotifyIconData,NotifyIcon是非常重要的一个变量,整个程序基本上是围着这个变量在转。TNotifyIconData是一个记录类型,按住Ctrl键,在TNotifyIconData 双击即进入ShellAPI.pas单元。(注:在Delphi中,这是一个非常好的对源代码进行分析的方法,源代码说明一切,你要想知道程序背后的内幕,最好的方法就是分析源代码!)此时出现了以下赋值语句:

TNotifyIconData = TNotifyIconDataA,这个意思很明显,就是说TNotifyIconData和TNotifyIconDataA是同种数据类型,接着往下看有:

TNotifyIconDataA = _NOTIFYICONDATAA,意思与刚才的一样,再往下看:

type

_NOTIFYICONDATAA = record

cbSize: DWORD;

Wnd: HWND;

uID: UINT;

uFlags: UINT;

uCallbackMessage: UINT;

hIcon: HICON;

szTip: array [0..63] of AnsiChar;

end;

请百度一下我发的那个函数,就会写托盘了。
参考技术B 要控件的话我传个给你

foobar2000设置关闭按钮最小化到系统托盘

1、设置托盘选项:

2、【File】->【Preferences】->【Advanced】->【Display】->【Default User Interface】->【Close minimises】

 

最后来一张经典皮肤感受下foobar2000的强大:

 

以上是关于delphi怎么写“最小化到系统托盘”(有控件最好)的主要内容,如果未能解决你的问题,请参考以下文章

C# 实现WinForm窗口最小化到系统托盘代码,并且判断左右鼠标的事件

Java的。最小化到系统托盘

最小化到系统托盘区是啥意思?

请问怎样使程序在最小化后图标放在任务栏的托盘上?

最小化到系统托盘区是啥意思?

vmware6.2能否像6.5一样可以最小化到托盘区?