メインフォームの非表示について


中本忍  2008-06-30 09:53:59  No: 31119  IP: 192.*.*.*

メインフォームを非表示にしたいので、下記命令を追加しました。
Application.ShowMainForm := False; 

しかし、その後で自動的にタスクトレイに常駐するのですが、
タスクトレイにアイコンが表示されなくなりました。

メイン画面を表示せず、タスクトレイのみ表示させたいのですが、
何か良い方法はありませんか。

よろしくお願い致します。

編集 削除
KHE00221  2008-07-03 08:41:34  No: 31120  IP: 192.*.*.*

タスクバーの事をタスクトレイと言っている気がするので

Application.ShowMainForm := False; 
だとフォームが表示されません、
フォームがないとタスクバーには表示されませんので

procedure TForm4.FormCreate(Sender: TObject);
begin
    Application.ShowMainForm := False;
    WindowState := wsMinimized;
    Application.ShowMainForm := True;
end;

としてフォーム非表示 -> 最小化 -> フォーム表示とする事により
起動時の最初化アニメーションがされずにいきなりタスクバーに
アイコンが表示されます

しかしタスクバーをクリック等すると元にもどってしまうので
これを防ぎたい場合には以下のようにして下さい

  FOldWndProc: TFNWndProc;

function NewWndProc(hWnd: HWND; Msg: UINT;WParam: wPARAM; lParam: LPARAM): LRESULT;  stdcall;

implementation

{$R *.dfm}

function NewWndProc(hWnd: HWND; Msg: UINT;wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
    if (Msg = WM_SYSCOMMAND) and (wParam = SC_RESTORE) then
    begin
      Result := 0;
    end
    else
    begin
      Result := CallWindowProc(FOldWndProc, hWnd, Msg, wParam, lParam);
    end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    SetWindowLong(Application.Handle,GWL_WNDPROC, Longint(FOldWndProc));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    Application.ShowMainForm := False;
    WindowState := wsMinimized;
    Application.ShowMainForm := True;
    FOldWndProc := TFNWndProc(SetWindowLong(Application.Handle,GWL_WNDPROC, Longint(@NewWndProc)));

end;

編集 削除
KHE00221  2008-07-03 08:43:17  No: 31121  IP: 192.*.*.*

もっと簡単にするなら
Application.ShowMainForm := False; 
をなくして
Left := Screen.Width 
だけでも出来そうですが・・・・

編集 削除
にしの  2008-07-03 15:15:15  No: 31122  IP: 192.*.*.*

もしかして、メインフォームのハンドルをタスクトレイに登録しているのでは?
そうであれば、メインフォームを作成しなければハンドルもないので、タスクトレイに登録されません。
対策としては、
・タスクトレイ登録用ハンドルを別途用意する
・メインフォームをタスクトレイに登録するとして、メインフォームのWidth,Heightを0にする(もしくは画面の外に追いやる。KHE00221さんのやりかたですね)。
のどちらかかと思います。

編集 削除