如何最小化窗口到任务栏?(即不是将其缩小为图标)

7

我有一个窗口,想要将其最小化到任务栏,所以我调用了ShowWindow函数:

ShowWindow(Handle, SW_MINIMIZE);

与最小化到任务栏不同,窗口被图标化

enter image description here

窗口未被父窗口包含:

enter image description here

如何将窗口最小化到任务栏?


更新:

根据 2002 年的一些建议,我尝试设置 WS_EX_APPWINDOW 窗口样式和/或确保窗口没有所有者:

enter image description here

不幸的是,这会改变我的(Delphi)应用程序的行为,因为现在我的应用程序有了两个任务栏图标,而不是一个:

enter image description here

当然,这是 Delphi (5) 的产物;因为我正在解决另一个问题

但这不应该影响这个问题。我正在调用 ShowWindow(..., SW_MINIMIZE) API,但 Windows 却将应用程序图标化,而不是最小化窗口。

如何将窗口最小化到任务栏?


1
好的,那么这个标签存在是出于历史原因,而不是因为这个应用程序需要兼容W95,对吧? :) - Cobra_Fast
2
@Cobra_Fast:信不信由你,还有一些公司仍在使用Win95,因为他们有无法在后来的版本上运行的内部软件。并非所有人都会立即升级 - 在嘲笑自己不了解的东西之前,你应该先学习更多关于企业环境的知识。(我们大约一年前才摆脱了最后一个Win2K系统(全部升级到XP SP3),这周我们才拿到第一批Win7机器。) - Ken White
2
我了解企业环境,仍然认为@Cobra_Fast的“Lol”是合适的 ;) - Jemes
哦,请加上Windows标签,这就够了。如果问题能更详细地说明应用程序正在做什么,那就更好了,因为这意味着它的行为很奇怪。我从未见过应用程序会这样做。默认的Delphi应用程序不会这样做。你的应用程序有什么特别之处?为什么要调用原始的Windows API?使用VCL方法有什么问题吗? - David Heffernan
1
@Ian 我希望你知道的是,MSDN上有两个很棒的页面:http://msdn.microsoft.com/en-us/library/ms632599(VS.85).aspx 和 http://msdn.microsoft.com/en-us/library/cc144179(VS.85).aspx。 - David Heffernan
显示剩余4条评论
2个回答

12

任务栏上的图标是应用程序(句柄)的图标,而不是主窗体的图标。

使用:

Application.Minimize;

编辑: 但是从你提供的两个链接中,我明白你已经知道了...呃 ;)

这对于主窗体有效:

TForm1 = class(TForm)
private
  procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
protected
  procedure CreateParams(var Params: TCreateParams); override;

...

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do
  begin
    ExStyle := ExStyle or WS_EX_APPWINDOW;
    WndParent := GetDesktopWindow;
  end;
end;

procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
  if Msg.CmdType = SC_MINIMIZE then
    ShowWindow(Handle, SW_MINIMIZE)
  else
    inherited;
end;

如果想要将应用程序的任务栏图标隐藏(只保留主窗体的任务栏图标),可以将该窗体的Visible属性设置为True,并在项目文件中隐藏应用程序:

Application.Initialize;
Application.CreateForm(TForm1, Form1);
ShowWindow(Application.Handle, SW_HIDE);
Application.Run;

对于这个表单,ShowWindow(Handle, SW_MINIMIZE); 应该可以工作。当最小化或恢复时,它还提供了 Windows 的默认缩放功能。

(在 XP 和 W7 上测试过 D5 和 D7)


哇,太神奇了,它起作用了!谢谢!但我仍然好奇当Windows“最小化”我的窗口时它在做什么 - 但其实并没有。 - Ian Boyd
1
WinSDK 关于 WS_EX_APPWINDOW:当窗口最小化时,强制将顶级窗口固定到任务栏上。因此我认为,并且非常确定,“正常”的最小化(没有这个扩展窗口样式)就像在 MDI 应用程序中最小化 MDIChild 一样:在这种情况下,Windows 桌面就是您的 MDIForm。 - NGLN
1
@Ian Boyd:您可能还想检查已添加到您其他问题中的完整版本 - NGLN
也适用于Windows 10,这就是我正在寻找的。在可视化方面,Word和Excel在打开多个文档时都是一样的。 - user1937012

0
一个非常简单的解决方案是禁用FORM上的最小化图标
[对象检视器]-[表单属性]-[边框图标]-[biMinimize]
应用程序仍然可以通过在任务栏上点击应用程序图标来最小化和恢复

enter image description here


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