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.
4

4 に答える 4

5

それでも機能する場合は、JVCLTJvTrayIconを使用して自動的に処理するのがおそらく最も簡単です。

于 2010-05-22T18:45:44.657 に答える
4

CoolTrayIconの使用をお勧めします。著者は、トレイアイコンに関連するすべての問題をすでに解決しています。ソースと例が無料で、非常にデバッグされています。

http://subsimple.com/delphi.asp

于 2010-05-22T19:27:55.800 に答える
1

Application.BringToFront;使用する代わりに SetforegroundWindow(Application.Handle);

于 2018-10-27T14:31:43.150 に答える
-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;

唯一の問題:アプリケーションをシステムトレイに最小化できるのは1回だけです。次にそれを最小化したいときは、何も起こりません。なんで?

ソース:delphi.about.com

于 2010-05-23T22:46:37.340 に答える