2011-09-19 106 views
2

如果用戶試圖啓動我的應用程序的另一個實例,我想激活已經運行的進程的窗口。激活隱藏進程的窗口

要找到這個過程,我打電話給Process.GetProcessesByName(),它給了我的應用程序運行實例的System.Diagnostics.Process實例。不過,我已經隱藏我的過程中使用

Form.ShowInTaskbar = false 

任務欄這將導致Process.MainWindowHandle爲零,所以我不能訪問正在運行的進程的當前窗口。

有沒有另外一種方法可以激活已經運行的進程的窗口?

+0

請嘗試閱讀此處:http://www.go4expert.com/forums/showthread.php?t = 973) –

+2

(http://www.go4expert.com/forums/showthread.php?t=973)這是一個更好的鏈接:http://www.codeproject.com/KB/cs/SingleInstanceAppMutex.aspx – Will

回答

2

是的,ShowInTaskBar屬性是特殊的。 Form類有幾個屬於同一類的其他屬性。這些屬性由原生CreateWindowEx()winapi調用中指定的樣式標誌實現。 ShowInTaskBar的WS_EX_APPWINDOW標誌。

當您更改這些屬性時,這是一個問題,窗口必須是重新創建。 Winforms自動爲你做這件事,但它有幾個副作用。其中之一是Handle屬性值更改。使Process類無法找到MainWindowHandle。

您必須以其他方式找回窗口。讓Winforms窗體工作對於Winforms窗體來說絕對不是一件容易的事,你不能得到一個可猜測的窗口類的名字。不改變ShowInTaskBar屬性當然是更好的方法。另外考慮使用WindowsFormsApplicationBase class,它使OnStartupNextInstance方法變得很簡單。

+0

我討厭鏈接到吸血鬼網站,但MSDN失去了我的文章:http://www.windowsdevelop.com/windows-形式 - 一般/如何打開已經運行的應用程序選項-19513.shtml –

+0

吸血鬼網站有時很好,當時賭注很重要! – Tipx

+0

看來,WindowsFormsApplicationBase檢查一個實例是否已經在使用sempaphores運行。如果已經有一個實例在運行,它使用Remoting在現有進程上調用OnStartupNextInstance。這可以用來讓這個過程顯示出來。 – Sjoerd