2010-03-28 4 views
2

Я просто хочу спросить ваше мнение/предложение о том, чтобы «прекратить» запущенное приложение/процесс C#C#/NET: Закрытие другого процесса вне главного окна

Прямо сейчас, у меня есть следующие коды:

Process myProcess; 
    private void btnOpen_Click(object sender, RoutedEventArgs e) 
    { 
     DirectoryInfo di = new DirectoryInfo(System.Environment.GetFolderPath(Environment.SpecialFolder.Programs)); 
     myProcess = Process.Start(di + @"\Wosk\Wosk.appref-ms"); // opening a file coming for Startup Menu 
    } 

    private void btnClose_Click(object sender, RoutedEventArgs e) 
    { 
     myProcess.Kill(); // not working - Cannot process request because the process has exited 
    } 

Я также пробовал myProcess.Close(); но ничего не происходит.

ответ

3

Вы должны взглянуть на

Process.HasExited Property

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

+3

Это неправильный подход, потому что сразу после возвращения false процесс может выйти. Итак, проверка на 'if (! MyProcess.HasExited) {myProcess.Kill(); } 'все равно может вызвать исключение. Гораздо лучше просто вызвать «Убить» и разобраться с полученным исключением. – JaredPar

2

Сначала замените:

di + @"\Wosk\Wosk.appref-ms" 

с:

Path.Combine(di.FullName, @"Wosk\Wosk.appref-ms") 

Теперь к делу: я не знаю, что Wosk.appref-ms или как начинается этот процесс. Если это файл, он будет открыт с помощью программы по умолчанию, связанной с этим расширением файла. Проблема может быть связана с тем фактом, что начавшийся процесс запускает другой процесс и немедленно завершается. Вот почему, когда вы пытаетесь убить его, он говорит, что он уже вышел, но фактический процесс, который он породил, все еще работает. В этом случае вам придется перечислить текущие процессы с помощью Process.GetProcesses(), найти процесс и остановить его.

+0

Я не получаю ваш Path.Combine, но у меня все в порядке. – abramlimpin

3

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

try { 
    myProcess.Kill(); 
} catch (InvalidOperationException) { 
    // Process is already finished so nothing to do 
} 
3

Вы запускали программу, которая была установлена ​​с помощью ClickOnce. Программа .appref-ms выполняется вспомогательной программой rundll32.exe, которая запускает процесс и быстро завершает работу. Чтобы завершить начатый процесс, вам нужно найти фактический запуск .exe с помощью Process.GetProcessesByName() и использовать метод Kill.

Мы не можем сказать вам, что такое имя процесса, которое содержится в файле .appref-ms. Но вам легко увидеть с TaskMgr.exe.

3
Process[] islemler = Process.GetProcessesByName("osk"); 
foreach (Process islem in islemler) 
    islem.Kill(); 
+0

Это сработало, чтобы закрыть myProcess.Start ("osk.exe"); – gridtrak