2012-05-19 132 views
2

環境 - C#,.net 4.0,VS 2010如何檢測當前登錄用戶是否正在運行進程?

你好,我已經爲Windows編寫了一個簡單的shell替換。當用戶登錄時,shell會自動啓動。當用戶退出我的shell時會啓動正常的Windows「explorer.exe」。

現在,當用戶退出(並正確支持此操作)時,我需要能夠檢查當前登錄用戶是否在運行「explorer.exe」。這可以防止代碼不必要地再次啓動它,這會導致「Windows資源管理器」應用程序窗口。

我已經看到了無數的例子,說明如何檢查一個進程是否正在運行......但沒有看到它是否爲當前登錄用戶運行。

下面的代碼將檢查「explorer.exe」是否已經運行,如果不是,則會啓動它。但有些情況下,這些代碼在不需要的時候會測試正面的結果!

例如,當使用快速用戶切換時...另一個用戶登錄到機器,結果在進程列表中顯示「explorer.exe」。但是,當「explorer.exe」正在運行時,它不會針對當前登錄的用戶運行!所以當我的shell退出時,代碼會測試正確,並且「explorer.exe」不會啓動。用戶剩下一個黑色的屏幕,沒有殼!

那麼,如何修改下面的代碼來測試當前登錄用戶是否運行「explorer.exe」?

Process[] Processes = Process.GetProcessesByName("explorer"); 
if (Processes.Length == 0) 
{ 
    string ExplorerShell = string.Format("{0}\\{1}", Environment.GetEnvironmentVariable("WINDIR"), "explorer.exe"); 
    System.Diagnostics.Process prcExplorerShell = new System.Diagnostics.Process(); 
    prcExplorerShell.StartInfo.FileName = ExplorerShell; 
    prcExplorerShell.StartInfo.UseShellExecute = true; 
    prcExplorerShell.Start(); 
} 

回答

3

你可以從你的過程中獲得的SessionID,然後查詢進程並獲得具有相同的SessionID Explorer實例,讓我們說,你的程序被命名爲「NewShell」:

Process myProc = Process.GetProcesses().FirstOrDefault(pp => pp.ProcessName.StartsWith("NewShell")); 
    Process myExplorer = Process.GetProcesses().FirstOrDefault(pp => pp.ProcessName == "explorer" && pp.SessionId == myProc.SessionId); 

    if (myExplorer == null) 
    StartExplorer() 

BTW。如果您使用ProcessName.StartsWith("NewShell")而不是ProcessName == "NewShell",那麼它也將在VS調試器下工作(它會將vshost添加到exe)

+0

感謝! final code: Process prcShell = Process.GetProcesses()。FirstOrDefault(pp => pp.ProcessName.StartsWith(「Shell」));進程prgExplorer = Process.GetProcesses()。FirstOrDefault(pp => pp.ProcessName ==「explorer」&& pp.SessionId == prcShell.SessionId); 如果(prcExplorer == NULL){ 串 = ExplorerShell的String.Format( 「{0} \\ {1}」,Environment.GetEnvironmentVariable( 「WINDIR」), 「explorer.exe的」); 過程prcExplorerShell = new Process(); prcExplorerShell.StartInfo.FileName = ExplorerShell; prcExplorerShell.StartInfo.UseShellExecute = true; prcExplorerShell.Start(); } –

相關問題