最小化应用程序(不使用托盘图标)

Minimize Application (NOT using trayicon)

我读了很多这方面的资料,但我似乎越读越糊涂。我正在使用 Delphi 2007,我想在启动时最小化我的应用程序,我对系统托盘图标不感兴趣,只需要一个任务栏图标即可恢复应用程序。

如果您采用所有项目中最简单的一个,只有一个主窗体并在 .dpr 文件集中:

Application.MainFormOnTaskBar := true;
Application.ShowMainForm := false;

和运行应用程序,没有可见的任务栏图标,因此无法恢复和激活应用程序。

在启动时最小化而不显示主窗体然后将其最小化的正确方法是什么?这看起来很简单,但对我来说却不是。

如果Windows是目标OS:

只需在设计时将主窗体的 WindowState 属性 设置为 wsMinimized

您也可以在运行时在表单的 OnCreate 事件中执行此操作:

procedure TForm1.FormCreate(Sender: TObject);
begin
  Perform(WM_SYSCOMMAND, SC_MINIMIZE, 0);
end;

事实上,这很简单,在文档中有解释,但有点难以找到,因为它没有从您可能 expect/search 找到它的地方链接。

System.CmdShow

Specifies the flags for displaying the application's main window.


procedure TForm1.FormCreate(Sender: TObject);
begin
  CmdShow := SW_SHOWMINNOACTIVE;
  ...


没有记录,但唯一支持的标志是 SW_SHOWMINNOACTIVESW_SHOWMAXIMIZED,所以你不能使用 SW_SHOWMINIZED.

此外,不要忘记删除 ShowMainForm := false; 语句,否则表单将不可见,因此不会有任何任务栏图标。

更新

D2007 的 TApplication.Run 中存在一个错误(至少在 XE2 中已更正)导致上述解决方案根本无法显示主窗体。 SW_SHOWMINNOACTIVE 案例分支中缺少 FInitialMainFormState := wsMinimized; 语句。

在D2007中使用WindowState,但是窗体的OnCreate设置太早,VCL在OnCreate运行后分配主窗体并修改了一些window 样式。将 OnShow 与标志一起使用,这样您就不会在应用程序的生命周期中(启动时除外)设置 window 状态。

type
  TForm1 = class(TForm)
    ..
  private
    FRunOneTime: Boolean;
    ..

procedure TForm1.FormShow(Sender: TObject);
begin
  if not FRunOneTime then begin
    WindowState := wsMinimized;
    FRunOneTime := True;
  end;
end;