我们刚刚将我们的应用程序从MDI容器移动到单个文档界面.我们的用户习惯使用MDI父级中的"Windows"菜单并排显示窗口.我们希望训练他们右键单击Windows任务栏并使用那里的窗口管理功能.
使用Delphi应用程序,我们注意到windows shell为隐藏的"Application"窗口留出了空间.因此,如果我只打开两个窗户,它将安排三个房间.应用程序窗口并未真正显示,但仍有空间.
由于我们有两个不同的应用程序,因此情况更糟.如果他们在每个应用程序中只打开一个窗口并想要并排显示它们,那么实际上会尝试占用4个窗口.
因此,我没有看到两个窗口占据屏幕的1/2,而是看到两个窗口占据了桌面的1/4,而屏幕的其余部分则打开了.
我发现在我的应用程序启动时添加一行来隐藏应用程序窗口将解决这个问题.
ShowWindow(Application.Handle,SW_HIDE);
编辑,以防有人没有读到答案.基于Craig的回答,我将windows样式设置为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并再次选择"并排显示Windows",每个屏幕占据屏幕的一半.
在Delphi 2007(及更高版本)中,应用程序窗口根本不会显示在TaskBar上
Application.MainFormOnTaskbar := True;
Run Code Online (Sandbox Code Playgroud)
line位于项目文件(*.dpr)中.例如
begin
Application.Initialize;
Application.MainFormOnTaskbar := True; // <--
Application.CreateForm(TForm7, Form7);
Application.CreateForm(TForm8, Form8);
Application.Run;
end.
Run Code Online (Sandbox Code Playgroud)
这是新应用程序的默认设置,但如果从以前的Delphi版本移植应用程序,则不存在此行 - 您应手动添加此行.
只要 MainFormOnTaskBar 为 true,您就可以通过将其添加到 DPR 来解决该问题:
SetWindowLong(Application.Handle, GWL_EXSTYLE,
GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
Run Code Online (Sandbox Code Playgroud)
WS_EX_TOOLWINDOW更高版本的 Delphi在创建 TApplication 句柄时自动包含该标志。