如何在一个进程正在运行,为当前登录的用户检测?(How to detect if a process

2019-06-25 08:42发布

环境 - C#,.NET 4.0,VS 2010

您好,我写了一个简单的外壳更换为Windows。 当用户登录。正常的Windows“explorer.exe的”启动,当用户退出我的壳壳会自动启动。

现在,当用户退出(并适当支持这个)我需要能够检查是否“explorer.exe的”正在运行当前登录的用户。 这可以防止代码无需重新启动它,这会导致“Windows资源管理器”应用程序窗口。

我已经看到了如何检查,看看如果一个进程正在运行...但没有看它是否正在运行当前登录用户的例子不胜枚举。

下面的代码会检查,看看是否“explorer.exe的”正在运行,如果它是不是会启动它。 但也有在这段代码测试阳性时,它并不需要的情况下!

例如,使用快速用户切换时...另一个用户登录到计算机,并且作为结果,“explorer.exe的”表示在进程列表。 但是,“Explorer.exe的”正在运行时,它不运行当前登录的用户! 所以,当我的外壳退出,代码测试呈阳性反应,而“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();
}

Answer 1:

你可以从你的过程中获得的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"那么它将与调试也(将其添加vshost exe文件)下工作



文章来源: How to detect if a process is running for the current logged-in user?