Как узнать, работает ли процесс с помощью С#?
У меня есть приложение 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();
}
Ответы
Ответ 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);