最小化の状態で起動

解決


Manbon  2007-12-06 21:50:11  No: 28848

起動時に、一瞬でもフォームが表示されずに、タスクトレイ上の
アイコンだけが表示されるような起動方法はあるでしょうか?
(起動後は一般的なアプリと同じ動作を行うものとします)
(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;


KHE00221  2007-12-06 22:06:22  No: 28849

こんな感じ?

  Application.Initialize;
  Application.ShowMainForm := False;       //追加
  Application.CreateForm(TForm1, Form1);
  Application.Run;

BDS2006 or D7 + XP


Manbon  2007-12-06 23:25:55  No: 28850

Application.ShowMainForm := False;
ですと、フォームもアイコンも表示されませんでした;;


KHE00221  2007-12-07 00:18:57  No: 28851

タスクトレイじゃなくてタスクバーの事か・・・

  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  CMDSHOW := SW_SHOWMINNOACTIVE;
  Application.Run;


KHE00221  2007-12-07 00:23:21  No: 28852

一瞬表示されちゃうな・・・


KHE00221  2007-12-07 00:29:18  No: 28853

WindowsState を wsNormal にしとけば大丈夫ぽいですが
wsMinimized にしておくと一瞬表示されるぽいです


ofZ  2007-12-07 00:59:50  No: 28854

>  Application.ShowMainForm := False;       //追加
    +
> WindowState を wsMinimized 
    +
フォームのOnCreateでタスクトレイに入れる処理を書いておく

これではだめなのか?


もにゃ  2007-12-07 01:01:05  No: 28855

無駄に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.


ofZ  2007-12-07 01:19:00  No: 28856

これは?
最初のウインドウ復元が、ちょっと・・・

>   Application.Initialize;
>   Application.CreateForm(TForm1, Form1);
  ShowWindow(Application.Handle, SW_MINIMIZE);  //追加
>   CMDSHOW := SW_SHOWMINNOACTIVE;
>   Application.Run;


Manbon  2007-12-07 01:34:46  No: 28857

皆様、ありがとうございました。
上記も含めて色々試した挙句、偶然、以下だけでできるようになりました。
フォームとApplicationの両方の最小化がいるみたいですね・・・

procedure TForm1.FormCreate(Sender: TObject);
begin
  WindowState := wsMinimized;
  ShowWindow(Application.Handle, SW_MINIMIZE);


Manbon  2007-12-07 01:35:29  No: 28858

解決です。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加