【问题标题】:Is it OK to hide Delphi's "Application" Window?隐藏Delphi的“应用程序”窗口可以吗?
【发布时间】:2011-06-15 15:49:50
【问题描述】:

我们刚刚将应用程序从 MDI 容器移至单个文档界面。我们的用户习惯于使用 MDI 父级中的“Windows”菜单并排显示窗口。我们想训练他们右键单击 Windows 任务栏并使用那里的窗口管理功能。

在 Delphi 应用程序中,我们注意到 windows shell 为隐藏的“应用程序”窗口留出了空间。因此,如果我只打开两扇窗户,它将安排三个房间。应用程序窗口并未真正显示,但仍有空间。

由于我们有两个不同的应用程序,情况变得更糟。如果他们在每个应用程序中只打开一个窗口并希望并排显示它们,实际上会尝试占用 4 个窗口。

因此,我看到的不是两个各占屏幕 1/2 的窗口,而是两个占桌面 1/4 的窗口,而屏幕的其余部分是打开的。

我发现在我的应用程序启动时添加一行来隐藏应用程序窗口可以解决这个问题。

ShowWindow(Application.Handle, SW_HIDE);

编辑以防有人不阅读 直到答案。基于克雷格的 在下面回答我正在设置窗户 样式改为 WS_EX_TOOLWINDOW 而不是 隐藏窗口。 SetWindowLong(Application.Handle, GWL_EXSTYLE, GetWindowLong(Application.Handle, GWL_EXSTYLE) 或 WS_EX_TOOLWINDOW);

我的(原始)问题是:这安全吗(隐藏应用程序窗口)?我想知道隐藏应用程序窗口是否会破坏其他东西。我需要注意什么副作用吗?有没有更好的方法来解决这个问题?

我使用的是 Delphi 2007。问题似乎在 Windows XP、Vista 和 7 中是一致的。

更新:一些答案​​似乎认为问题在于应用程序表单图标可见。事实并非如此。我已经将 MainFormOnTaskbar 设置为 true。

此外,如果您正在对此进行测试,请注意 Delphi IDE(仅在 2007 中测试)会使事情变得更糟。尝试这个。打开 Delphi IDE 和两个记事本实例。最小化 IDE,但不要最小化两个记事本。右键单击选择并排显示 Windows。您将看到每个记事本占据屏幕的 1/3。关闭 IDE 并再次选择 Show Windows Side by Side,每个将占据屏幕的 1/2。

【问题讨论】:

    标签: delphi


    【解决方案1】:

    在 Delphi 2007(及更高版本)中,应用程序窗口根本不显示在任务栏上,如果

    Application.MainFormOnTaskbar := True;
    

    行位于项目文件 (*.dpr) 中。例如

    begin
      Application.Initialize;
      Application.MainFormOnTaskbar := True;   // <--
      Application.CreateForm(TForm7, Form7);
      Application.CreateForm(TForm8, Form8);
      Application.Run;
    end.
    

    这是新应用程序的默认设置,但如果您从以前的 Delphi 版本移植应用程序,则此行不存在 - 您应该手动添加此行。

    【讨论】:

    • 我的问题不在于任务栏上的窗口。它是在排列列表中包含的窗口。我可以采用一种形式的默认项目并将 MainFormOnTaskbar 设置为 true。然后运行exe两次,右键单击任务栏并选择“并排显示Windows”。每个窗口只占屏幕的 1/4 而不是 1/2。
    • @Mark - 无法使用 Delphi 2009 重现 - 每个窗口都占据屏幕的 1/2。这个问题是 Delphi 2007 特有的——克雷格的回答解决了这个问题。
    【解决方案2】:

    只要 MainFormOnTaskBar 为 true,您就可以通过将其添加到 DPR 来解决问题:

    SetWindowLong(Application.Handle, GWL_EXSTYLE,
      GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
    

    较新版本的 Delphi 在创建 TApplication 句柄时会自动包含 WS_EX_TOOLWINDOW 标志。

    【讨论】:

    • 它已经离开任务栏了。问题是在自动排列可见窗口时让 Windows 忽略该窗口。
    • @Mark:我链接的部分代码将应用程序窗口标记为工具窗口,从而解决了您看到的问题。我假设他们在以后的 Delphis 中做了类似的事情,因为在 Delphi XE 中没有必要。
    • @Mark:查看我的编辑;我已经用 Delphi 2007 和 XP 验证了修复。
    • 效果很好。由于这是 Delphi XE 正在做的事情,我在我的代码中这样做似乎是合理的。谢谢!
    【解决方案3】:

    我仍在使用 Delphi 7,我一直在使用这种技术与 the 'WndParent:=GetDesktopWindow' trick 结合来为每个窗口获取一个任务栏按钮,有点像 Microsoft Office 从某个版本开始做的事情(我猜是 XP?)

    【讨论】:

    【解决方案4】:

    我相信这是应用程序最小化到系统托盘的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 2019-01-05
      • 2018-01-31
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多