Версия 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 через системное диалоговое окно UAC, используйте следующее:
Process p = new Process();
ProcessStartInfo psi = new ProcessStartInfo(@"cmd.exe");
psi.UseShellExecute = true;
psi.Verb = "runas";
p.StartInfo = psi;
p.Start();
В приведенном примере показано, как можно запускать новый процесс с повышенными привилегиями.