2009-04-11 98 views
13

我希望能夠從任務欄隱藏另一個應用程序的窗口,而不隱藏窗口本身。具體來說,我希望有幾個不同的Web瀏覽器在Alt + Tab列表中可用,但不佔用任務欄上的空間。如果有人想知道爲什麼:我已經編寫了一個儀表板應用程序,它使用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。只要您不介意窗口焦點時任務欄按鈕重新出現,這很好。

回答

6

MSDN

版本4.71和更高的Shell32.dll的補充修改任務欄的內容的能力。從應用程序中,您現在可以添加,刪除和激活任務欄按鈕。激活該項目不會激活窗口;它顯示在任務欄上按下的項目。

任務欄修改功能在暴露ITaskbarList接口(IID_ITaskbarList)的組件對象模型(COM)對象(CLSID_TaskbarList)中實現。您必須調用ITaskbarList :: HrInit方法來初始化該對象。然後可以使用ITaskbarList接口的方法來修改任務欄的內容。

看起來像COM互操作是可靠地操縱任務欄內容的方法。特別是,你需要調用以下功能:

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

+0

甜 - 我從來不知道這件事,但聽起來像票。謝謝! – 2009-04-11 14:55:31

0

您是否試過刪除WS_EX_APPWINDOW

+0

是的,我做到了。這隻有在其他應用程序必須首先添加「WS_EX_APPWINDOW」時纔有效,例如,如果它有一個所有者窗口。普通的頂級窗口不需要`WS_EX_APPWINDOW`,所以它不能刪除。 – 2009-04-11 14:54:50

相關問題