从 Windows 10 的任务栏中删除窗口

Posted

技术标签:

【中文标题】从 Windows 10 的任务栏中删除窗口【英文标题】:Remove window from taskbar on Windows 10 【发布时间】:2016-06-10 12:53:26 【问题描述】:

我想在具有多个桌面的 Windows 10 上从任务栏中删除窗口。 对于 Windows 8.1,我使用了 ITaskbarList::DeleteTab,它运行良好。

对于 Windows 10,此方法也会从任务栏中隐藏 Windows,但之后我会在所有桌面上看到此窗口。我只想在一个桌面上看到这个窗口。

有谁知道在 Windows 10 中从任务栏中隐藏窗口并将此窗口保留在一个桌面上的方法?

您可以在下面看到,我在“从 Windows 10 的任务栏中隐藏窗口”下的意思:

【问题讨论】:

什么是“在 Windows 10 中从任务栏中隐藏窗口并将此窗口保留在一个桌面上”“应该是什么意思?你能改写一下吗? 谢谢,我会尝试添加图片。 那是窗口预览。 .... 这是一个 Windows 配置选项,除非您想操作 Windows 设置,否则这里没有什么可以“删除”的。这闻起来像是请求恶意软件创建协助。 @specializt 确实是这么说的,但令人困惑的是,文档是在谈论 MFC 所有权,而不是 Win32 所有权。遗憾的是,Win32 SDK 文档经常交替使用这些术语,因为相同的函数入口点用于设置父级或所有者。这是可行的,因为单个窗口可以有要么 一个父 一个所有者(取决于它是子窗口还是***窗口),不能同时拥有 /i>。不久前,Raymond Chen 在博客中谈到了这一点;强烈推荐阅读以消除混乱:blogs.msdn.microsoft.com/oldnewthing/20100315-00/?p=14613 【参考方案1】:

在我的理解中,通过我的经验测试证明,出现在任务栏预览中的窗口与通常出现在任务栏中的窗口完全相同。很久以前,比如说在 Windows 2000 中,应用程序的每个符合条件的窗口都只会在任务栏上显示为按钮。从 Windows XP 开始,任务栏分组成为一种选择,因此来自单个应用程序的所有符合条件的窗口都可以组合在一起,并在任务栏上显示为单个按钮。然后,在 Windows Vista 中,当您将鼠标悬停在相应的任务栏按钮上时,可以显示这些打开窗口的预览。 Windows 8 和 Windows 10 都没有改变这一基本规则。他们只是改变了预览的外观。

因此,我们可以参考MSDN documentation 来了解哪些窗口出现在任务栏上的规则:

每当应用程序创建一个不属于自己的窗口时,Shell 就会在任务栏上创建一个按钮。要确保窗口按钮放置在任务栏上,请使用WS_EX_APPWINDOW 扩展样式创建一个无主窗口。要防止窗口按钮放置在任务栏上,请使用 WS_EX_TOOLWINDOW 扩展样式创建无主窗口。作为替代方案,您可以创建一个隐藏窗口,并让这个隐藏窗口成为您可见窗口的所有者。

Raymond Chen 更准确地总结了这些规则here。引用他的话:

有一些关于哪些窗口进入任务栏的基本规则。简而言之:

如果设置了WS_EX_APPWINDOW 扩展样式,那么它将显示(可见时)。 如果窗口是顶层无主窗口,那么它将显示(可见时)。 否则不显示。

(虽然ITaskbarList 界面有点搞混了。)

你之前把事情搞砸了,打电话给ITaskbarList::DeleteTab。那是没有必要的。为确保窗口不会出现在任务栏中,只需应用与窗口何时出现 的规则相反的规则。

如果您有一个顶层无主窗口,它将显示在任务栏中,除非您删除 WS_EX_APPWINDOW 扩展窗口样式。如果您有一个拥有的窗口,那么它不会显示在任务栏中,除非 WS_EX_APPWINDOW 扩展窗口样式设置为强制它在那里。

因此,如果您设置了 WS_EX_APPWINDOW 扩展窗口样式集,则应将其删除。那就是强制窗口显示在任务栏中。

否则,您应该为您的窗口设置所有者。例如,使第二个窗口归第一个窗口所有。

【讨论】:

感谢您对窗口的父/所有者的回答和评论非常有用。我发现我的错误在哪里。我在这里留下关于 Qt 特定的评论,因为它可能对某些事情有用。如果你想用所有者(非父)创建 QWidget,你需要在 QWidget 的构造函数中传递父并设置窗口标志(例如 Qt::Window,Qt::Tool)。如果在 contrucor 之后调用 setParent 和 setWidnwoFlags,它会将 parent(非所有者)设置为 window。【参考方案2】:

TL;DR:

    从扩展样式中删除 WS_EX_APPWINDOWWS_EX_TOOLWINDOW。 设置窗口的所有者。

示例:

从扩展样式中移除标志:

SetWindowLong(myHWND, GWL_EXSTYLE, 
    GetWindowLong(myHWND, GWL_EXSTYLE) & ~WS_EX_APPWINDOW & ~WS_EX_TOOLWINDOW);

设置所有者:

SetWindowLongPtr(myHWND, GWLP_HWNDPARENT, myOwnerHWND);

完整解释:

尽管Cody's answer 很棒,但它并不能完全回答确切的问题。

确切的问题是:“如何显示一个没有出现在任务栏中的窗口,只出现在一个虚拟桌面上

正如 Cody 所解释的,有几种方法可以删除窗口的任务栏按钮。但是,其中只有 一种 方法可以使其同时仅显示在一个虚拟桌面上。

如果您在扩展样式中包含标志WS_EX_APPWINDOW,它将强制窗口显示在任务栏中。这就是为什么在这种情况下必须清除它。

如果您在扩展样式中包含标志WS_EX_TOOLWINDOW,它将强制窗口显示在任务栏中,将强制显示窗口在所有虚拟桌面上。因此,这里也不是一个选项。

最后,如果您的窗口没有标志,当且仅当它没有所有者时,它才会显示在任务栏中。无论哪种方式,它都不会在所有虚拟桌面上强制执行。因此,解决方案是既没有标志,也没有设置所有者。

【讨论】:

【参考方案3】:

WS_EX_NOACTIVATE 添加到窗口的 ex 样式中。 https://docs.microsoft.com/en-us/windows/win32/winmsg/extended-window-styles

使用此样式创建的***窗口不会成为 用户单击时的前景窗口。系统不带 当用户最小化或关闭 前景窗口。该窗口不应通过激活 编程访问或通过可访问的键盘导航 技术,例如讲述人。要激活窗口,请使用 SetActiveWindow 或 SetForegroundWindow 函数。窗户没有 默认出现在任务栏上。强制窗口出现在 任务栏,使用 WS_EX_APPWINDOW 样式。

【讨论】:

以上是关于从 Windows 10 的任务栏中删除窗口的主要内容,如果未能解决你的问题,请参考以下文章

PyQt 从任务栏中删除窗口

获取任务栏中的窗口(EnumWindows函数)

Tkinter,Windows:如何在没有标题栏的 Windows 任务栏中查看窗口?

如何使用 C# 从 Windows 任务栏中删除新闻和兴趣? [关闭]

win7下怎样关闭任务栏中的进度条,但不关掉窗口预览

隐藏 Windows任务栏中的窗口显示