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

时间:2009-04-11 05:35:53

标签: c# .net pinvoke

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

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

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

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

我发现this question的措辞与我的相似,但它特别针对您自己流程中的窗口,您可以完全控制窗口所有权。

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


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

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

2 个答案:

答案 0 :(得分:5)

来自MSDN

  

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

     

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

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

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

答案 1 :(得分:0)

您是否尝试删除WS_EX_APPWINDOW