2010-12-15 106 views
6

安裝任何應用程序期間。通常要求用戶在開始安裝之前關閉所有窗口。如果沒有,安裝將停在中間 並要求用戶關閉所有打開的窗口。 我被要求在XXX應用程序中添加代碼。當應用程序正在運行,並且如果用戶打開任何其他窗口(例如:Explore,瀏覽器,單詞等),則應用程序應該拋出一個窗口,說明您已打開窗口列表。 我請求你,請建議我如何在C#中啓動。獲取打開的窗口列表C#

回答

0

嘗試SetWinEventHook通過P/Invoke的WinAPI函數。你可以勾選EVENT_OBJECT_CREATE事件,但我不是100%確定的。我從來沒有在C#中做過,只有在C/C++中。

1

您可以使用System.Diagnostics.Process類來獲取機器中正在運行的所有進程的信息。然後,您可以嘗試查找預期的應用程序/進程是否正在運行。

您可以使用GetProcesses()GetProcessByName()方法。請參閱this msdn link以供參考。我相信可以有更高效的方式來實現。 HTH

7

測試此:

var openWindowProcesses = System.Diagnostics.Process.GetProcesses() 
    .Where(p => p.MainWindowHandle != IntPtr.Zero && p.ProcessName != "explorer"); 

openWindowProcesses應該包含他們有一個活躍的主窗口中所有打開的應用程序。

我把p.ProcessName != "explorer"放在where表達式中,因爲explorer是桌面的主進程,它永遠不應該關閉。

要觀察執行過程,您可以使用ManagementEventWatcher類。請參閱this

+0

爲了解決需要通過定時器得到窗口列表中所描述的問題。隱藏的窗戶是什麼? – DReJ 2010-12-15 15:23:35

+0

我想誰問這個問題知道關於使用計時器和......關於隱藏的窗口;在這種情況下,我認爲這足以關閉具有未隱藏窗口的進程。儘管在這些情況下,流程比窗口更重要。程序員應該檢查進程,找出哪一個不應該打開。通過更改Where方法中的表達式很容易實現。 但是,謝謝!我將在我的答案中添加關於觀看過程的一些信息。 – 2010-12-15 15:35:51

+0

非常感謝您的建議。一旦我執行,我會讓你知道結果 – user517206 2010-12-16 05:57:58

1

建立一個foreach循環像這樣枚舉系統上的所有打開的應用程序(即有明顯的主窗口)

foreach (var process in Process.GetProcesses().Where(p => p.MainWindowHandle != IntPtr.Zero)) { 
    //do something with the process here. To display it's name, use process.MainWindowTitle 
    } 
+0

如果應用程序有多個可見窗口,該怎麼辦? – Neolisk 2015-12-29 17:06:51