我希望能够从任务栏隐藏另一个应用程序的窗口,而不隐藏窗口本身.具体来说,我希望在Alt + Tab列表中运行,可见,可用的几个不同的Web浏览器,但不占用任务栏上的空间.
(如果有人好奇为什么:我编写了一个仪表板应用程序,它使用Vista的DwmRegisterThumbnail API同时显示几个窗口的实时预览 - 如果你愿意的话,这是一种"画中画".此时,还有任务栏按钮对于那些窗口似乎是多余的.)
我知道将其他窗口的样式更改为include WS_EX_TOOLWINDOW会将其隐藏在任务栏中,我先尝试了.但是,正如预期的那样,它有一些我不想要的副作用:标题栏变得更短(不是很糟糕,我猜)并且最小化和最大化按钮消失了(不好).我还必须隐藏并重新显示窗口以使任务栏识别出更改,这会导致重新绘制工件,当我对IE窗口进行操作时.
我的下一个想法是,由于默认情况下窗口与所有者隐藏在任务栏中,也许我可以将其他窗口更改为我的所有权.但MSDN 非常清楚 "创建一个拥有的窗口,应用程序无法将窗口的所有权转移到另一个窗口."
我发现这个问题与我的问题类似,但它特别关注来自您自己的进程的窗口,您可以完全控制窗口所有权.
有没有人知道隐藏任务栏按钮的任何其他方法,这将适用于来自另一个进程的窗口?
更新: Tormod通过ITaskbarList让我走上正轨 - 它运行良好.pinvoke.net页面有一些错误(错误的GUID,按字母顺序而不是按接口顺序声明的方法),但我编辑了它,进行了更正,还添加了一个如何通过其coclass实例化ITaskbarList的示例.
更新2:如果您使用DeleteTab隐藏窗口的任务栏按钮,然后将其设置为活动窗口(例如,通过SetForegroundWindow或Alt + Tab),它的任务栏按钮将重新出现.为了保持任务栏按钮隐藏,我不得不添加一个计时器并继续调用DeleteTab.只要您不介意任务栏按钮在窗口聚焦时重新出现,这很有效.
来自MSDN:
Shell32.dll的4.71版及更高版本添加了修改任务栏内容的功能.从应用程序中,您现在可以添加,删除和激活任务栏按钮.激活项目不会激活窗口; 它显示在任务栏上按下的项目.
任务栏修改功能在公开ITaskbarList接口(IID_ITaskbarList)的组件对象模型(COM)对象(CLSID_TaskbarList)中实现.您必须调用ITaskbarList :: HrInit方法来初始化对象.然后,您可以使用ITaskbarList接口的方法来修改任务栏的内容.
似乎COM互操作是可靠地操纵任务栏内容的方法.特别是,您需要调用以下函数:
您可以在pinvoke.net上找到ITaskbarList接口的C#签名:ITaskbarList.