環境 - 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();
}
感謝! 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(); } –