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

Uni*_*ick 5 c++ windows taskbar windows-10

我想从具有多个桌面的 Windows 10 上的任务栏中删除窗口。对于 Windows 8.1,我使用了 ITaskbarList::DeleteTab 并且效果很好。

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

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

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

在此处输入图片说明

fko*_*rsa 5

长话短说:

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

例子:

从扩展样式中删除标志:

SetWindowLong(myHWND, GWL_EXSTYLE, 
    GetWindowLong(myHWND, GWL_EXSTYLE) & ~WS_EX_APPWINDOW & ~WS_EX_TOOLWINDOW);
Run Code Online (Sandbox Code Playgroud)

设置所有者:

SetWindowLongPtr(myHWND, GWLP_HWNDPARENT, myOwnerHWND);
Run Code Online (Sandbox Code Playgroud)

完整解释:

尽管科迪的回答很好,但它并没有完全回答确切的问题。

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

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

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

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

最后,如果您的窗口没有这两个标志,当且仅当它没有所有者时,它才会显示在任务栏中。不管怎样,它不会强迫自己出现在所有虚拟桌面上。因此,解决方案是不设置任何标志,而是设置一个所有者。


Cod*_*ray 4

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

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

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

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

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

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

(尽管ITaskbarList接口使这有点混乱。)

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

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

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

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