Delphi:最小化应用程序到系统托盘

caw*_*caw 2 windows delphi taskbar systray

我想最小化一个Delphi应用程序到系统托盘而不是任务栏.

必要的步骤似乎如下:

  1. 创建应该在系统托盘中显示的图标.
  2. 当用户单击[ - ]以最小化应用程序时,请执行以下操作:
    1. 隐藏表单.
    2. 将图标(步骤#1)添加到系统托盘.
    3. 隐藏/删除任务栏中的应用程序条目.
  3. 当用户双击系统托盘中的应用程序图标时,请执行以下操作:
    1. 显示表格.
    2. 再次取消应用程序的最小化并将其置于最前面.
    3. 如果"WindowState"是"WS_Minimized"设置为"WS_Normal".
    4. 隐藏/删除系统托盘中的应用程序图标.
  4. 当用户终止应用程序时,请执行以下操作:
    1. 隐藏/删除系统托盘中的应用程序图标.

而已.对?

如何在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.
Run Code Online (Sandbox Code Playgroud)

Ign*_*ams 5

如果它仍然有效,那么使用JVCLTJvTrayIcon自动处理它可能是最容易的.