最小化の状態で起動

解決


Manbon  2007-12-06 12:50:11  No: 28848  IP: 192.*.*.*

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

こんな感じ?

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

BDS2006 or D7 + XP

編集 削除
Manbon  2007-12-06 14:25:55  No: 28850  IP: 192.*.*.*

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

編集 削除
KHE00221  2007-12-06 15:18:57  No: 28851  IP: 192.*.*.*

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

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

編集 削除
KHE00221  2007-12-06 15:23:21  No: 28852  IP: 192.*.*.*

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

編集 削除
KHE00221  2007-12-06 15:29:18  No: 28853  IP: 192.*.*.*

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

編集 削除
ofZ  2007-12-06 15:59:50  No: 28854  IP: 192.*.*.*

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

これではだめなのか?

編集 削除
もにゃ  2007-12-06 16:01:05  No: 28855  IP: 192.*.*.*

無駄に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-06 16:19:00  No: 28856  IP: 192.*.*.*

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

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

編集 削除
Manbon  2007-12-06 16:34:46  No: 28857  IP: 192.*.*.*

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

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

編集 削除
Manbon  2007-12-06 16:35:29  No: 28858  IP: 192.*.*.*

解決です。

編集 削除