如何最小化一个窗口到任务栏? (即不图标化)

Posted

技术标签:

【中文标题】如何最小化一个窗口到任务栏? (即不图标化)【英文标题】:How to minimize a window to the taskbar? (i.e. not iconify) 【发布时间】:2011-09-07 21:48:54 【问题描述】:

我有一个要最小化的窗口(到任务栏),所以我打电话给ShowWindow

ShowWindow(Handle, SW_MINIMIZE);

除了不是最小化自身(到任务栏),窗口是图标化

窗口没有父级:

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


更新:

Following some advice from 2002,我尝试设置WS_EX_APPWINDOW 窗口样式和/或确保窗口没有所有者:

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

这当然是Delphi(5)的神器;因为我是trying to solve another issue。

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

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

【问题讨论】:

嘿,Microsoft 在 Windows 95 中添加了任务栏 - 很合适! (实际上它适用于从 Windows 95 到 Windows 7 的所有操作系统) 好吧,那么这个标签是有历史原因的,而不是因为这个应用程序需要与 W95 兼容,对吧? :) @Cobra_Fast:信不信由你,有些公司仍在使用 Win95,因为他们有内部软件,无法在更高版本上运行。不是每个人都会立即升级——在嘲笑你不了解的东西之前,你应该更多地了解公司环境。 (大约一年前,我们刚刚摆脱了上一个 Win2K 系统(所有 XP SP3),本周获得了我们的第一台 Win7 机器。) 我了解企业环境,但仍然认为@Cobra_Fast 的“Lol”很合适 ;) @Ian 我希望您知道 MSDN 上有两个很棒的页面:msdn.microsoft.com/en-us/library/ms632599(VS.85).aspx 和 msdn.microsoft.com/en-us/library/cc144179(VS.85).aspx 【参考方案1】:

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

用途:

Application.Minimize;

编辑:但是从你的两个链接中,我知道你已经知道了……duh ;)

这适用于 MainForm:

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;

并从任务栏中隐藏 Application.Handle(仅具有 MainForm 的任务栏图标):将此 Form 的 Visible 属性设置为 True 并在项目文件中隐藏 Application:

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

对于这种形式,ShowWindow(Handle, SW_MINIMIZE); 应该可以工作。它还提供了 Windows 最小化或还原时的默认缩放功能。

(在 XP 和 W7 上使用 D5 和 D7 测试)

【讨论】:

天哪,这行得通!谢谢!但我仍然很好奇 Windows 在“最小化”我的窗口时在做什么——但不是真的。 WinSDK 关于 WS_EX_APPWINDOW:当窗口最小化时,强制将顶层窗口放到任务栏上。所以我认为并且非常肯定地知道,“正常”最小化(没有这种扩展窗口样式)就像最小化 MDI 应用程序中的 MDIChild:在这种情况下,Windows 桌面就是你的 MDIForm。 @Ian Boyd:您可能还想检查 fully worked out version 是否已添加到您的其他问题中。 也可以在 Windows 10 上使用,这就是我想要的。当我打开多个文档时,在视觉上 Word 和 Excel 会做同样的事情。【参考方案2】:

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

【讨论】:

以上是关于如何最小化一个窗口到任务栏? (即不图标化)的主要内容,如果未能解决你的问题,请参考以下文章

打开的程序如何快速最小化到任务栏

delphi在窗口最小化时不在任务栏

如何通过单击任务栏图标禁用最小化

qt去掉标题栏的窗口,最小化到任务栏后,怎么没有系统菜单?

Java swing 窗口最小化到任务栏 点击左键显示

如何解决Win10个性化设置最小化任务栏后不能弹出的问题