【发布时间】:2009-04-12 01:50:00
【问题描述】:
我希望能够从任务栏中隐藏另一个应用程序的窗口,而不隐藏窗口本身。具体来说,我希望在 Alt+Tab 列表中运行、可见、可用的几个不同的 Web 浏览器,但不占用任务栏上的空间。
(如果有人好奇为什么:我编写了一个仪表板应用程序,它使用 Vista 的 DwmRegisterThumbnail API 来一次显示多个窗口的实时预览——如果你愿意的话,这是一种“画中画”。那时,也为这些窗口设置任务栏按钮似乎是多余的。)
我知道将另一个窗口的样式更改为包含WS_EX_TOOLWINDOW 会将其从任务栏中隐藏,我首先尝试了这个。但是,正如预期的那样,它有一些我不想要的副作用:标题栏变短了(我猜不是全是坏的),最小化和最大化按钮消失了(不好)。我还必须隐藏并重新显示窗口以让任务栏识别更改,这会在我对 IE 窗口执行此操作时导致重新绘制工件。
我的下一个想法是,由于默认情况下具有所有者的窗口从任务栏中隐藏,也许我可以将其他窗口更改为我的。但是 MSDN 是 pretty clear 说“[a]在创建一个拥有的窗口之后,应用程序不能将窗口的所有权转移到另一个窗口。”
我发现this question 的措辞与我的相似,但它专门针对您自己进程中的窗口,您可以完全控制窗口所有权。
有谁知道隐藏任务栏按钮的任何其他方法,这适用于另一个进程的窗口?
更新: Tormod 通过 ITaskbarList 让我走上了正轨——效果很好。 pinvoke.net 页面有一些错误(错误的 GUID,按字母顺序而不是按界面顺序声明的方法),但我对其进行了编辑,进行了更正,还添加了一个如何通过其 coclass 实例化 ITaskbarList 的示例。
更新 2: 如果您使用 DeleteTab 隐藏窗口的任务栏按钮,然后将其设为活动窗口(例如通过 SetForegroundWindow 或 Alt+Tab),其任务栏按钮将重新出现。为了隐藏任务栏按钮,我必须添加一个计时器并继续调用 DeleteTab。只要您不介意在窗口获得焦点时任务栏按钮会短暂重新出现,这样就可以正常工作。
【问题讨论】:
-
它对我有用:stackoverflow.com/questions/19022789/… call taskbar.Hide()
-
@SamiBelkhiria 这与这个问题无关。这不是隐藏任务栏,而是隐藏单个任务栏按钮。