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

时间:2012-05-19 15:50:57

标签: c# .net shell process

环境 - C#,。net 4.0,VS 2010

您好,我已经为Windows编写了一个简单的shell替代品。用户登录时会自动启动shell。正常的Windows" explorer.exe"用户退出我的shell时启动。

现在,当用户退出(并正确支持)时,我需要能够检查" 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();
}

1 个答案:

答案 0 :(得分: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()

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