如何检测当前登录用户的进程是否正在运行?

环境 – 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”未启动。 用户留下黑屏,没有shell!

那么,我如何修改下面的代码来测试当前登录用户是否正在运行“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(); } 

您可以从您的进程获取SessionID,然后查询Processes并获取具有相同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() 

顺便说一句。 如果您使用ProcessName.StartsWith("NewShell")而不是ProcessName == "NewShell"那么它也可以在VS调试器下工作(它将vshost添加到exe)