Или очевидная кнопка «всегда возобновлять», которая однажды нажата, просто пробьет себе путь через любую из заблокированных точек останова?
blockquote>Нажмите и удерживайте Resume нажмите кнопку и выберите Принудительное выполнение сценария . Примечание: я не говорю, что это очевидно, но я думаю, что это то, что вы хотите.
Кнопка Деактивировать точки останова также может работать.
Это должно сделать это для Вас.
//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;
}
Можно использовать LINQ также,
var processExists = Process.GetProcesses().Any(p => p.ProcessName.Contains("<your process name>"));
Я использовал функцию AppActivate во времени выполнения VB для активации существующего процесса. Необходимо будет импортировать Microsoft. VisualBasic dll в проект C#.
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);
}
}
}
Можно просто перечислить процессы с помощью Процесс. Метод GetProcesses .
Я думаю, что полный ответ на Вашу проблему требует понимания того, что происходит, когда Ваше приложение решает, что экземпляр foo.exe уже работает т.е. что делает '//TODO: Переключитесь на процесс foo.exe, на самом деле означают?
В прошлом проекте я должен был предотвратить несколько выполнение процесса, таким образом, я добавил некоторый код в init разделе того процесса, который создает именованное взаимное исключение. Этот mutext был создан и получен перед продолжающейся остальной частью процесса. Если процесс может создать взаимное исключение и получить его, то это - первое выполнение. Если другой процесс уже управляет взаимным исключением, то тот, какие сбои не являются первыми, таким образом, это сразу выходит.
я просто пытался препятствовать тому, чтобы второй экземпляр работал, из-за зависимостей от определенных аппаратных интерфейсов. В зависимости от того, в чем Вы нуждаетесь с тем "переключателем к" строке, Вам, возможно, понадобилось бы более определенное решение, такое как идентификатор процесса или дескриптор.
кроме того, у меня был доступ исходного кода к процессу, который я пытался запустить. Если Вы не можете изменить код, добавив, что взаимное исключение является, очевидно, не опцией.
Две проблемы для учета:
Ваш пример включил размещение пароля на командной строке. То представление открытого текста секрета могло быть уязвимостью системы обеспечения безопасности.
При перечислении процессов, спросите себя, которые обрабатывают Вас, действительно хотят перечислить. Все пользователи, или просто текущий пользователь? Что, если текущий пользователь зарегистрирован дважды (два рабочих стола)?
Mnebuerquo записал:
кроме того, у меня был доступ исходного кода к процессу, который я пытался запустить. Если Вы не можете изменить код, добавив, что взаимное исключение является, очевидно, не опцией.
у меня нет доступа исходного кода к процессу, который я хочу выполнить.
я закончил тем, что использовал proccess MainWindowHandle для переключения на процесс, как только я нашел, что это - выполнение alread:
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool SetForegroundWindow(IntPtr hWnd);