Delphi的“Application”窗口隐藏是否可行?

5
我们刚把应用从MDI容器移动到单文档界面。我们的用户习惯于在MDI父窗口中使用“Windows”菜单来并排显示窗口。我们希望训练他们右键单击Windows任务栏并在那里使用窗口管理功能。
对于Delphi应用程序,我们注意到Windows shell为隐藏的“Application”窗口留下了空间。因此,如果我只打开两个窗口,它将为三个窗口安排空间。Application窗口实际上并没有显示,但是留下了空间。
这一点更糟糕的是,我们有两个不同的应用程序。如果他们每个应用程序只打开一个窗口,并且想要并排显示它们,窗口实际上会尝试占用4个窗口的空间。
所以,我看到的不是两个各占屏幕1/2的窗口,而是两个占据了1/4桌面的窗口,其余部分是开放的。
我发现在应用程序启动时添加一行以隐藏应用程序窗口将解决此问题。
我的(原始)问题是:这样做是否安全(隐藏应用程序窗口)?我想知道通过隐藏应用程序窗口是否可能会破坏其他内容。我需要注意哪些副作用?是否有更好的方法来解决此问题?
我正在使用Delphi 2007。这些问题似乎在Windows XP、Vista和7上都是一致的。
更新:有些答案似乎认为问题在于Application窗体图标可见。事实并非如此。我已经将MainFormOnTaskbar设置为true。
另外,如果您正在测试此功能,请注意Delphi IDE(仅测试了2007)会使情况变得更糟。试试这个。打开Delphi IDE和两个记事本实例。最小化IDE,但两个记事本未被最小化。右键单击选择并排显示窗口。你会看到每个记事本占据屏幕的1/3。关闭IDE并再次选择Show Windows Side by Side,每个记事本将占据屏幕的1/2。
4个回答

5
在Delphi 2007(及以上版本)中,如果应用程序窗口的Visible属性设置为False,则任务栏上将不会显示该窗口。
Application.MainFormOnTaskbar := True;

“line”是指项目文件(*.dpr)中的一行代码。例如:

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

这是新应用程序的默认设置,但如果您将应用程序从以前的Delphi版本移植过来,这行代码就会缺失 - 您需要手动添加此行代码。

我的问题不在于窗口显示在任务栏上,而是窗口被包括在排列列表中。我可以使用一个带有一个窗体的默认项目,并将MainFormOnTaskbar设置为true。然后运行exe两次,在任务栏上右键单击并选择“并排显示窗口”。每个窗口只会占据屏幕的四分之一,而不是一半。 - Mark Elder
@Mark - 无法在Delphi 2009上复现 - 每个窗口都按照应有的大小占据屏幕的1/2。这个问题只出现在Delphi 2007中 - Craig的答案解决了它。 - kludg

3
只要MainFormOnTaskBar为true,您就可以通过将以下内容添加到DPR来解决问题:
SetWindowLong(Application.Handle, GWL_EXSTYLE,
  GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);

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


已经从任务栏中移除了。问题是如何让Windows在自动排列可见窗口时忽略该窗口。 - Mark Elder
@Mark:我链接的代码的一部分将应用程序窗口标记为工具窗口,这解决了您所看到的问题。我假设在后来的Delphi版本中他们也会做类似的事情,因为在Delphi XE中这是不必要的。 - Zoë Peterson
@Mark:请看我的修改;我已经在Delphi 2007和XP上验证了修复。 - Zoë Peterson
非常好。既然Delphi XE正在这样做,那么我在我的代码中也这样做似乎是合理的。谢谢! - Mark Elder

0

我仍在使用Delphi 7,并且我一直在结合{{link1:'WndParent:= GetDesktopWindow'技巧}}使用此技术,以获取每个窗口的任务栏按钮,有点像Microsoft Office自某个版本(我猜测是XP?)开始做的那样。


1
你是指这个方法吗?"ShowWindow(Application.Handle, SW_HIDE);"? - Mark Elder
1
你应该将WndParent设置为0,而不是GetDesktopWindow。http://blogs.msdn.com/b/oldnewthing/archive/2004/02/24/79212.aspx - Zoë Peterson

-1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接