Как использовать класс Process в .NET Framework

Версия 1.4 (обновлено 9 ноября 2008 г.)

Иногда программисту требуется запустить другое приложение из своей программы. Для этой цели подойдет метод Start класса Process из пространства имен System.Diagnostics. Как и многие другие методы в .NET, метод Start имеет несколько перегруженных версий. Вам нужно лишь выбрать наиболее подходящий вариант для выполнения ваших задач.

Запуск документа в сопоставленной программе

Если вы хотите показать текстовый файл в Блокноте, то просто напишите:


Process.Start("readme.txt");
или
Process.Start("notepad", "readme.txt");

Учтите, что файл readme.txt должен находиться в той же папке, что и вызывающее приложение. Программа Блокнот должна быть программой по умолчанию для текстовых файлов для первого случая (или у вас запустится другой текстовый редактор). Во втором случае Блокнот (notepad.exe) должен быть прописан в переменной среды. Если вы раньше программировали на VB6, то Process.Start напомнит вам команду Shell:


lngPID = Shell("readme.txt", vbNormalFocus) 

Вы можете использовать команду Shell и в VB.NET, но делать этого совсем не стоит.

Запуск браузера по умолчанию

Если вам нужно запустить браузер по умолчанию по заданной ссылке, то используйте следующий код:


// Запускаем браузер по умолчанию на заданной странице
System.Diagnostics.Process.Start
    ("http://netsources.narod.ru/book.htm", "");

Создание и отправка письма

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


System.Diagnostics.Process.Start
    ("mailto:[email protected]?subject=About Windows", null);
    

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


System.Diagnostics.ProcessStartInfo processprop = new System.Diagnostics.ProcessStartInfo();
processprop.FileName = "notepad";
processprop.Arguments = @"C:\windows\readme.txt";
processprop.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;  // в развернутом виде
System.Diagnostics.Process process = new System.Diagnostics.Process();
process = System.Diagnostics.Process.Start(processprop);

Если вам необходим запуск приложения с запретом на закрытие своего приложения (В VB6 пришлось бы использовать кучу вызовов Windows API), то используйте метод WaitForExit.

C помощью класса Process можно не только запускать приложения, но и закрывать их при помощи метода Kill.

Обратите внимание, что на панели инструментов появился компонент Process, который вы можете добавить в свой проект и выполнить многие задачи еще на этапе разработки, а не во время выполнения программы.

Свернуть все программы Блокнот

С помощью метода Process.GetProcessesByName можно получить список всех запущенных экземпляров Notepad.exe и применить к ним какие-нибудь действия. Например, мы хотим свернуть все запущенные программы Блокнот.


private void minimizeNotepads()
{
    Process[] processes = Process.GetProcessesByName("Notepad");
    foreach (Process p in processes)
    {
        IntPtr app_hwnd;
        WINDOWPLACEMENT wp = new WINDOWPLACEMENT();
        app_hwnd = p.MainWindowHandle;
        GetWindowPlacement(app_hwnd, ref wp);
        wp.showCmd = 2;
        SetWindowPlacement(app_hwnd, ref wp);
    }
}

В приведенном примере сначала получаем список запущенных процессов Notepad, а затем при помощи функций Windows API сворачиваем все обнаруженные окна Блокнота.

Незаметный» запуск внешних процессов

Иногда возникает необходимость запустить внешний процесс, получить от него какие-либо данные (либо просто дать ему возможность отработать) и затем его закрыть. Однако внешний процесс становится виден пользователю (часто это можно наблюдать при работе инсталляторов). А вот чтобы запустить внешний процесс незаметно для пользователя, надо в классе настроек запуска процесса ProcessStartInfo свойству WindowStyle присвоить значение ProcessWindowStyle.Hidden.

Например, вы можете запустить Блокнот как скрытый процесс:

ProcessProperties.WindowStyle = ProcessWindowStyle.Hidden;

Но в этом случае нужно быть осторожным, так как неправильное использование этой возможности может привести к печальным последствиям.

Ниже представлен небольшой пример «незаметного» запуска процессов, который запускает утилиту Reg.exe и делает бэкап ветки реестра HKEY_CLASSES_ROOT\mailto в файл.


static void Main()
{
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.FileName = "reg";
    startInfo.Arguments = @"save HKEY_CLASSES_ROOT\mailto c:\mailto.reg";
    startInfo.WindowStyle = ProcessWindowStyle.Hidden;
    Process.Start(startInfo);
}

Повышение уровня привилегий в Windows Vista

Чтобы повысить уровень привилегий в Windows Vista через системное диалоговое окно UAC, используйте следующее:


Process p = new Process();
ProcessStartInfo psi = new ProcessStartInfo(@"cmd.exe");
psi.UseShellExecute = true;
psi.Verb = "runas";
p.StartInfo = psi;
p.Start(); 

В приведенном примере показано, как можно запускать новый процесс с повышенными привилегиями.

Реклама