2012-03-21 83 views
0

可能重複:
Restore a minimized window of another application如何恢復一個程序的窗口最小化到托盤

我要恢復(演出,並給予重點)到外部程序。

問題是,如果它在托盤上的MainWindowHandle是0,所以我無法恢復窗口。

Process[] process = Process.GetProcessesByName("MyApp"); 
//process.MainWindowHandle == 0 if it is on tray!! :(

我已經搜索谷歌和stackoverflow。我發現了一些具有相同問題的線程,但沒有答案。

[DllImport("user32.dll")] 
public static extern bool ShowWindow(IntPtr windowHandle, ShowWindowFlag flag); 

如何從托盤彈出外部應用程序並將其帶到任務欄?


我可以用FindWindow函數,

[DllImport("User32.dll", CharSet = CharSet.Unicode)] 
    public static extern IntPtr FindWindow(string className, string windowName); 

,但如果有更多的一個過程相同類別和標題,FindWindow函數將返回只是其中之一,我怎麼能解決這個問題?

+0

不,它不是重複的,我的問題是當應用程序被隱藏時,最小化到托盤。 – Pedro77 2012-03-21 15:34:50

回答

4

問題是,Windows沒有支持將窗口最小化爲系統托盤。沒有這樣的狀態。而爲了模擬這種行爲,應用程序完全隱藏窗戶。 您可以使用Spy ++工具在目標應用程序可見時查找它的窗口。 然後「最小化」它到托盤,並查看屬性中發生了什麼變化。然後在你的應用程序中,你應該恢復屬性。這是必要的,因爲有幾種方法可以隱藏窗口,不同的應用程序使用其中的一種。

例如,Windows任務管理器將樣式從VS_VISIBLE更改爲VS_MINIMIZED(並刪除VS_VISIBLE)。

+0

謝謝,但如果應用程序已經在托盤上呢?沒辦法解決這個問題? – Pedro77 2012-03-21 15:50:51

+0

您應該只執行一次所描述的步驟,以便找到如何恢復窗口的確切方式以及它的類別和名稱。然後,您可以調用FindWindow WinAPI函數(或C#中的等效函數,我不確定它是如何調用的),它會返回一個句柄給您,您可以改變窗口的樣式,使其再次可見。 – 2012-03-21 16:05:16

+0

如果有多個應用程序以相同的類和名稱運行,該怎麼辦? – Pedro77 2012-03-21 16:47:04

相關問題