如何检测当前记录的进程是否正在运行

环境 - 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();
}

你可以从你的进程中获得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)

链接地址: http://www.djcxy.com/p/61109.html

上一篇: How to detect if a process is running for the current logged

下一篇: How to start a process under current User?