2012-05-19 3 views
2

Окружающая среда - 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(); 
} 

ответ

3

Вы можете получить SessionID от вашего процесса, а затем запросить процессы и получить экземпляр Проводника, которые имеют тот же SessionID, скажем, что ваша программа называется «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)

+0

СПАСИБО! Окончательный код: Процесс prcShell = Process.GetProcesses(). FirstOrDefault (pp => pp.ProcessName.StartsWith («Shell»)); Процесс prcExplorer = Process.GetProcesses(). FirstOrDefault (pp => pp.ProcessName == "explorer" && pp.SessionId == prcShell.SessionId); if (prcExplorer == null) { string ExplorerShell = string.Format ("{0} \\ {1}", Environment.GetEnvironmentVariable ("WINDIR"), "explorer.exe"); Процесс prcExplorerShell = new Process(); prcExplorerShell.StartInfo.FileName = ExplorerShell; prcExplorerShell.StartInfo.UseShellExecute = true; prcExplorerShell.Start(); } –

Смежные вопросы