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

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

必要的步骤似乎如下:

  1. 创build应该显示在系统托盘上的图标。
  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. 

Solutions Collecting From Web of "Delphi:最小化应用程序到系统托盘"

我会推荐使用CoolTrayIcon。 作者已经解决了所有与托盘图标有关的问题。 其免费的源码和例子,非常调试。

http://subsimple.com/delphi.asp

如果它仍然有效,那么使用JVCL的TJvTrayIcon来自动处理它可能是最简单的。

在下面的文本中,我将指的是问题中提到的步骤号码:

以下解决方案是没有任何额外的组件。 这很容易实现。

步骤1:

只需使用应用程序的主图标(请参阅下面的代码)。

第2步:

 procedure TForm1.ApplicationEvents1Minimize(Sender: TObject); begin Shell_NotifyIcon(NIM_ADD, @TrayIconData); Form1.Hide; end; 

步骤#3:

 procedure TForm1.TrayMessage(var Msg: TMessage); begin if Msg.lParam = WM_LBUTTONDOWN then begin Form1.Show; Form1.WindowState := wsNormal; Application.BringToFront; Shell_NotifyIcon(NIM_DELETE, @TrayIconData); end; end; 

步骤4:

 procedure TForm1.FormDestroy(Sender: TObject); begin Shell_NotifyIcon(NIM_DELETE, @TrayIconData); end; 

界面部分的必要代码:

 uses [...], ShellApi; const WM_ICONTRAY = WM_USER + 1; type TForm1 = class(TForm) [...] procedure TrayMessage(var Msg: TMessage); message WM_ICONTRAY; end; 

唯一的问题是:应用程序可以最小化到系统托盘一次。 下一次你想把它最小化,什么都不会发生。 为什么?

资料来源: delphi.about.com