【问题标题】:Hide another app's taskbar button隐藏另一个应用的任务栏按钮
【发布时间】: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。只要您不介意在窗口获得焦点时任务栏按钮会短暂重新出现,这样就可以正常工作。

【问题讨论】:

标签: c# .net pinvoke


【解决方案1】:

来自MSDN

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

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

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

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

【讨论】:

  • 甜蜜——我从来不知道这件事,但听起来像是门票。谢谢!
【解决方案2】:

你试过删除WS_EX_APPWINDOW吗?

【讨论】:

  • 是的,我做到了。这仅在其他应用程序必须首先添加 WS_EX_APPWINDOW 时才有效,例如如果它有一个所有者窗口。普通的顶层窗口不需要WS_EX_APPWINDOW,所以不用去掉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多