タスクバーではなく、システムトレイへの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.