隐藏另一个应用的任务栏按钮

我希望能够从任务栏隐藏另一个应用程序的窗口,而不隐藏窗口本身。 具体来说,我想在Alt + Tab列表中运行,可见,可用的几个不同的Web浏览器,但不占用任务栏上的空间。

(如果有人好奇为什么:我编写了一个仪表板应用程序,它使用Vista的DwmRegisterThumbnail API一次显示多个窗口的实时预览 – 如果你愿意,那就是一种“画中画”。此时,还有任务栏按钮对于那些窗口似乎是多余的。)

我知道更改其他窗口的样式以包含WS_EX_TOOLWINDOW会将其隐藏在任务栏中,我首先尝试了这个。 但是,正如预期的那样,它有一些我不想要的副作用:标题栏变得更短(不是很糟糕,我猜)并且最小化和最大化按钮消失了(不好)。 我还必须隐藏并重新显示窗口以使任务栏识别出更改,这会导致重新绘制工件,当我对IE窗口进行操作时。

我的下一个想法是,由于默认情况下窗口与所有者隐藏在任务栏中,也许我可以将其他窗口更改为我的所有。 但MSDN 非常清楚 “创建一个拥有的窗口,应用程序无法将窗口的所有权转移到另一个窗口。”

我发现这个问题与我的问题类似,但它特别关注来自您自己的流程的窗口,您可以完全控制窗口所有权。

有没有人知道隐藏任务栏按钮的任何其他方法,这将适用于来自另一个进程的窗口?


更新: Tormod通过ITaskbarList让我走上了正确的轨道 – 它非常棒。 pinvoke.net页面有一些错误(错误的GUID,按字母顺序而不是按接口顺序声明的方法),但我编辑了它,进行了更正,还添加了一个如何通过其coclass实例化ITaskbarList的示例。

更新2:如果您使用DeleteTab隐藏窗口的任务栏按钮,然后将其设置为活动窗口(例如,通过SetForegroundWindow或Alt + Tab),它的任务栏按钮将重新出现。 为了保持任务栏按钮隐藏,我不得不添加一个计时器并继续调用DeleteTab。 只要您不介意任务栏按钮在窗口聚焦时重新出现,这很有效。

来自MSDN :

Shell32.dll的4.71版及更高版本添加了修改任务栏内容的function。 从应用程序中,您现在可以添加,删除和激活任务栏按钮。 激活项目不会激活窗口; 它显示在任务栏上按下的项目。

任务栏修改function在公开ITaskbarList接口(IID_ITaskbarList)的组件对象模型(COM)对象(CLSID_TaskbarList)中实现。 您必须调用ITaskbarList :: HrInit方法来初始化对象。 然后,您可以使用ITaskbarList接口的方法来修改任务栏的内容。

似乎COM互操作是可靠地操纵任务栏内容的方式。 特别是,您需要调用以下函数:

  • ITaskbarList :: AddTab
  • ITaskbarList :: DeleteTab

您可以在pinvoke.net上找到ITaskbarList接口的C#签名:ITaskbarList 。

您是否尝试删除WS_EX_APPWINDOW