从 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_APPWINDOW
和 WS_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 的任务栏中删除窗口的主要内容,如果未能解决你的问题,请参考以下文章
Tkinter,Windows:如何在没有标题栏的 Windows 任务栏中查看窗口?