我想将 Delphi 应用程序最小化到系统托盘而不是任务栏。
必要的步骤似乎如下:
- 创建应显示在系统托盘中的图标。
- 当用户单击 [-] 以最小化应用程序时,请执行以下操作:
- 隐藏表格。
- 将图标(步骤 #1)添加到系统托盘。
- 在任务栏中隐藏/删除应用程序的条目。
- 当用户双击系统托盘中的应用程序图标时,执行以下操作:
- 显示表格。
- 再次取消最小化应用程序并将其置于最前面。
- 如果“WindowState”为“WS_Minimized”,则设置为“WS_Normal”。
- 在系统托盘中隐藏/删除应用程序的图标。
- 当用户终止应用程序时,请执行以下操作:
- 在系统托盘中隐藏/删除应用程序的图标。
而已。正确的?
如何在 Delphi 中实现这一点?
我找到了以下代码,但我不知道它为什么有效。它不遵循我上面描述的步骤......
unit uMinimizeToTray;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShellApi;
const WM_NOTIFYICON = WM_USER+333;
type
TMinimizeToTray = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure CMClickIcon(var msg: TMessage); message WM_NOTIFYICON;
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
MinimizeToTray: TMinimizeToTray;
implementation
{$R *.dfm}
procedure TMinimizeToTray.CMClickIcon(var msg: TMessage);
begin
if msg.lparam = WM_LBUTTONDBLCLK then Show;
end;
procedure TMinimizeToTray.FormCreate(Sender: TObject);
VAR tnid: TNotifyIconData;
HMainIcon: HICON;
begin
HMainIcon := LoadIcon(MainInstance, 'MAINICON');
Shell_NotifyIcon(NIM_DELETE, @tnid);
tnid.cbSize := sizeof(TNotifyIconData);
tnid.Wnd := handle;
tnid.uID := 123;
tnid.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
tnid.uCallbackMessage := WM_NOTIFYICON;
tnid.hIcon := HMainIcon;
tnid.szTip := 'Tooltip';
Shell_NotifyIcon(NIM_ADD, @tnid);
end;
procedure TMinimizeToTray.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caNone;
Hide;
end;
end.