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

时间:2016-06-10 12:53:27

标签: c++ windows windows-10 taskbar

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

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

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

下面你可以看到我在“从Windows 10中的任务栏隐藏窗口”中的含义:

enter image description here

2 个答案:

答案 0 :(得分: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扩展窗口样式,则应将其删除。这就是强制窗口显示在任务栏中。

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

答案 1 :(得分:1)

<强> TL; DR:

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

    从扩展样式中删除标志:

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

    设置所有者:

    SetWindowLongPtr(myHWND, GWLP_HWNDPARENT, myOwnerHWND);
    

    完整说明:

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

    确切的问题是:&#34;如何显示未出现在任务栏中的窗口,仅出现在一个虚拟桌面上

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

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

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

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