起動時に、一瞬でもフォームが表示されずに、タスクトレイ上の
アイコンだけが表示されるような起動方法はあるでしょうか?
(起動後は一般的なアプリと同じ動作を行うものとします)
(D5, W2K, XP)
WindowState を wsMinimized にすると一瞬フォームが表示され、
その後アニメーションを伴って最小化されながら起動します。
また、以下のようにやっても同様でした。
procedure CMShowingChanged(var Msg:TMessage); message CM_SHOWINGCHANGED;
procedure TForm1.CMShowingChanged(var Msg:TMessage);
begin
inherited;
if Visible then begin
ShowWindow(Application.Handle, SW_HIDE);
ShowWindow(Application.Handle, SW_MINIMIZE);
end;
end;
こんな感じ?
Application.Initialize;
Application.ShowMainForm := False; //追加
Application.CreateForm(TForm1, Form1);
Application.Run;
BDS2006 or D7 + XP
Application.ShowMainForm := False;
ですと、フォームもアイコンも表示されませんでした;;
タスクトレイじゃなくてタスクバーの事か・・・
Application.Initialize;
Application.CreateForm(TForm1, Form1);
CMDSHOW := SW_SHOWMINNOACTIVE;
Application.Run;
一瞬表示されちゃうな・・・
WindowsState を wsNormal にしとけば大丈夫ぽいですが
wsMinimized にしておくと一瞬表示されるぽいです
> Application.ShowMainForm := False; //追加
+
> WindowState を wsMinimized
+
フォームのOnCreateでタスクトレイに入れる処理を書いておく
これではだめなのか?
無駄にFormを消費してよいならこんなのはどうでしょう?
Vista用フォームの応用です。
Project1.dpr (hidden)
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
Application.ShowMainForm:=False;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Unit1.pas (hidden)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Unit2;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
procedure Unit2Close(Sender: TObject; var Action: TCloseAction);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
Form2:TForm2;
begin
Form2:=TForm2.Create(self);
Form2.OnClose:=Unit2Close;
Form2.Show;
end;
procedure TForm1.Unit2Close(Sender: TObject; var Action: TCloseAction);
begin
Close;
end;
end.
Unit2.pas (Main Form)
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm2 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure WMSyscommand(var msg: TWmSysCommand); message WM_SYSCOMMAND;
procedure WMActivate(var msg: TWMActivate); message WM_ACTIVATE;
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.ExStyle := Params.ExStyle and not WS_EX_TOOLWINDOW or
WS_EX_APPWINDOW;
end;
procedure TForm2.WMActivate(var msg: TWMActivate);
begin
if (msg.Active = WA_ACTIVE) and not IsWindowEnabled(Handle) then
begin
SetActiveWindow(Application.Handle);
msg.Result := 0;
end else
inherited;
end;
procedure TForm2.WMSyscommand(var msg: TWmSysCommand);
begin
case (msg.CmdType and $FFF0) of
SC_MINIMIZE:
begin
ShowWindow(Handle, SW_MINIMIZE);
msg.Result := 0;
end;
SC_RESTORE:
begin
ShowWindow(Handle, SW_RESTORE);
msg.Result := 0;
end;
else
inherited;
end;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
ShowWindow(Application.Handle, SW_HIDE);
SetWindowLong(Application.Handle, GWL_EXSTYLE,
GetWindowLong(Application.Handle, GWL_EXSTYLE) and not WS_EX_APPWINDOW or
WS_EX_TOOLWINDOW);
ShowWindow(Application.Handle, SW_SHOW);
WindowState:=wsMinimized;
end;
end.
これは?
最初のウインドウ復元が、ちょっと・・・
> Application.Initialize;
> Application.CreateForm(TForm1, Form1);
ShowWindow(Application.Handle, SW_MINIMIZE); //追加
> CMDSHOW := SW_SHOWMINNOACTIVE;
> Application.Run;
皆様、ありがとうございました。
上記も含めて色々試した挙句、偶然、以下だけでできるようになりました。
フォームとApplicationの両方の最小化がいるみたいですね・・・
procedure TForm1.FormCreate(Sender: TObject);
begin
WindowState := wsMinimized;
ShowWindow(Application.Handle, SW_MINIMIZE);
解決です。
ツイート | ![]() |