2010-05-22 68 views
2

我想尽量减少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. 
+0

它曾经是该TApplication的是,创建任务栏条目中的一个,和TForms自由地独立行事。到最近为止这个变化了吗? – 2010-05-22 18:42:47

+2

你使用的是什么版本的Delphi?在更新的版本中,VCL中有一个TTrayIcon,至少可以用来创建托盘图标。 – 2010-05-22 19:32:23

+1

代码与你的步骤不同, - 系统托盘图标始终可见, - 它不会干扰“最小化”(没有第2步),当图标被双击时,它显示通过单击关闭框[X]隐藏的窗体, - 也是它不考虑终止(没有第4步)。 – 2010-05-22 21:47:39

回答

3

我会推荐使用CoolTrayIcon。作者已经解决了与托盘图标有关的所有问题。它免费提供源代码和示例,并进行了很多调试。

http://subsimple.com/delphi.asp

+0

这个组件工作正常。它可以满足TrayIcon的所有需求。谢谢! – caw 2010-05-25 11:29:24

4

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

+0

也许,我只是愚蠢的,但我没有找到这个下载链接。不过谢谢! ;)如果你看+3票,你的答案似乎很好...... – caw 2010-05-25 11:28:51

+0

这是第一个链接左侧的“下载”链接。 – 2010-05-25 12:03:23

-1

在下文中我会提到的问题中提到的步骤编号:

下面的解决方案是没有任何附加组件。这很容易实现。

第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