Подтвердить что ты не робот

Как узнать, работает ли процесс с помощью С#?

У меня есть приложение winforms С#, которое время от времени запускает внешний exe, но я не хочу запускать другой процесс, если он уже запущен, но скорее переключитесь на него.

Итак, как в С# я бы так это в приведенном ниже примере?

using System.Diagnostics;

...

Process foo = new Process();

foo.StartInfo.FileName = @"C:\bar\foo.exe";
foo.StartInfo.Arguments = "Username Password";

bool isRunning = //TODO: Check to see if process foo.exe is already running


if (isRunning)
{
   //TODO: Switch to foo.exe process
}
else
{
   foo.Start(); 
}
4b9b3361

Ответ 1

Это должно сделать это для ya.

Проверить процессы

//Namespaces we need to use
using System.Diagnostics;

public bool IsProcessOpen(string name)
{
    //here we're going to get a list of all running processes on
    //the computer
    foreach (Process clsProcess in Process.GetProcesses()) {
        //now we're going to see if any of the running processes
        //match the currently running processes. Be sure to not
        //add the .exe to the name you provide, i.e: NOTEPAD,
        //not NOTEPAD.EXE or false is always returned even if
        //notepad is running.
        //Remember, if you have the process running more than once, 
        //say IE open 4 times the loop thr way it is now will close all 4,
        //if you want it to just close the first one it finds
        //then add a return; after the Kill
        if (clsProcess.ProcessName.Contains(name))
        {
            //if the process is found to be running then we
            //return a true
            return true;
        }
    }
    //otherwise we return a false
    return false;
}


Ответ 2

Вы также можете использовать LINQ,

var processExists = Process.GetProcesses().Any(p => p.ProcessName.Contains("<your process name>"));

Ответ 3

Я использовал функцию AppActivate во время выполнения VB, чтобы активировать существующий процесс. Вам придется импортировать DLL Microsoft.VisualBasic в проект С#.

using System;
using System.Diagnostics;
using Microsoft.VisualBasic;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            Process[] proc = Process.GetProcessesByName("notepad");
            Interaction.AppActivate(proc[0].MainWindowTitle);
        }
    }
}

Ответ 4

Вы можете просто перечислить процессы, используя метод Process.GetProcesses.

Ответ 5

Я узнал, что Mutex не работает, как в приложении Console. Поэтому использование WMI для запроса процессов, которые можно увидеть с помощью окна диспетчера задач, решит вашу проблему.

Используйте что-то вроде этого:

static bool isStillRunning() {
   string processName = Process.GetCurrentProcess().MainModule.ModuleName;
   ManagementObjectSearcher mos = new ManagementObjectSearcher();
   mos.Query.QueryString = @"SELECT * FROM Win32_Process WHERE Name = '" + processName + @"'";
   if (mos.Get().Count > 1)
   {
        return true;
    }
    else
        return false;
}

ПРИМЕЧАНИЕ. Добавьте ссылку на сборку "System.Management", чтобы включить тип intellisense.

Ответ 6

Я думаю, что полный ответ на вашу проблему требует понимания того, что происходит, когда ваше приложение определяет, что экземпляр foo.exe уже запущен, т.е. что означает "//TODO: Переключиться на процесс foo.exe" на самом деле означает?

Ответ 7

В прошлом проекте мне нужно было предотвратить многократное выполнение процесса, поэтому я добавил некоторый код в секцию init этого процесса, который создает именованный мьютекс. Этот мьютекст был создан и приобретен до продолжения остальной части процесса. Если процесс может создать мьютекс и приобрести его, то он будет первым. Если другой процесс уже контролирует мьютекс, то тот, который терпит неудачу, не является первым, поэтому он немедленно выходит из системы.

Я просто пытался предотвратить запуск второго экземпляра из-за зависимостей от конкретных аппаратных интерфейсов. В зависимости от того, что вам нужно с этой "коммутацией", вам может понадобиться более конкретное решение, такое как идентификатор процесса или дескриптор.

Кроме того, у меня был исходный код доступа к процессу, который я пытался запустить. Если вы не можете изменить код, добавление мьютекса, очевидно, не является вариантом.

Ответ 8

Следует иметь в виду две проблемы:

  • Ваш пример включал размещение пароль в командной строке. Что откровенное представление тайны может быть уязвимостью безопасности.

  • При перечислении процессов спросите себя, который обрабатывает вас на самом деле хотите перечислить. Все пользователи, или только текущий пользователь? Что, если текущий пользователь регистрируется дважды (два настольные компьютеры)?

Ответ 9

Mnebuerquo писал (а):

Кроме того, у меня был доступ к исходному коду   процесс, который я пытался начать. если ты   не может изменить код, добавив   мьютекс, очевидно, не вариант.

У меня нет исходного кода для процесса, который я хочу запустить.

Я закончил использование программы MainWindowHandle, чтобы переключиться на этот процесс, как только обнаружил, что он работает в обратном порядке:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
 public static extern bool SetForegroundWindow(IntPtr hWnd);