9 ответов:
вы хотите использовать система.Диагностика.Процесс.Убей метод. Вы можете получить процесс, который вы хотите использовать
прямое убийство процесса Word возможно (см. некоторые другие ответы), но откровенно грубо и опасно: что делать, если у пользователя есть важные несохраненные изменения в открытом документе? Не говоря уже о устаревших временных файлах, которые это оставит позади...
Это, вероятно, так далеко, как вы можете пойти в этом отношении (VB.NET):
Dim proc = Process.GetProcessesByName("winword") For i As Integer = 0 To proc.Count - 1 proc(i).CloseMainWindow() Next iэто закроет все открытые окна Word упорядоченным образом (предлагая пользователю сохранить свою работу, если это применимо). Конечно же, пользователь всегда может нажать кнопку " Отмена "в этом сценарии, так что вы должны быть в состоянии справиться с этим случаем, а также (желательно, поставив" пожалуйста, закройте все экземпляры Word, иначе мы не можем продолжить " диалог...)
вот простой пример того, как убить все процессы Word.
Process[] procs = Process.GetProcessesByName("winword"); foreach (Process proc in procs) proc.Kill();
public bool FindAndKillProcess(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 by using the StartsWith Method, //this prevents us from incluing the .EXE for the process we're looking for. //. 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 if (clsProcess.ProcessName.StartsWith(name)) { //since we found the proccess we now need to use the //Kill Method to kill the process. 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 try { clsProcess.Kill(); } catch { return false; } //process killed, return true return true; } } //process not found, return false return false; }
вы можете обойти проблемы безопасности и создать гораздо более вежливое приложение, просто проверив, запущен ли процесс Word, и попросив пользователя закрыть его, а затем нажмите кнопку "Продолжить" в своем приложении. Это подход, используемый многими установщиками.
private bool isWordRunning() { return System.Diagnostics.Process.GetProcessesByName("winword").Length > 0; }конечно, вы можете сделать это только в том случае, если ваше приложение имеет графический интерфейс
в моем приложении для лотка мне нужно было очистить Excel и Word Interops. Таким образом, этот простой метод убивает процессы в целом.
Это использует общий обработчик исключений, но может быть легко разделен для нескольких исключений, как указано в других ответах. Я могу сделать это, если мой журнал производит много ложных срабатываний (т. е. не может убить уже убитых). Но до сих пор так guid (работа шутка).
/// <summary> /// Kills Processes By Name /// </summary> /// <param name="names">List of Process Names</param> private void killProcesses(List<string> names) { var processes = new List<Process>(); foreach (var name in names) processes.AddRange(Process.GetProcessesByName(name).ToList()); foreach (Process p in processes) { try { p.Kill(); p.WaitForExit(); } catch (Exception ex) { // Logging RunProcess.insertFeedback("Clean Processes Failed", ex); } } }вот как я тогда это называл:
killProcesses((new List<string>() { "winword", "excel" }));
что-то вроде этого будет работать:
foreach ( Process process in Process.GetProcessesByName( "winword.exe" ) ) { process.Kill(); process.WaitForExit(); }
Это лучше практиковать, безопаснее и вежливее, чтобы обнаружить, если процесс запущен и сказать пользователю, чтобы закрыть его вручную. Конечно, вы также можете добавить тайм-аут и убить процесс, если они ушли...
пожалуйста, смотрите пример ниже
public partial class Form1 : Form { [ThreadStatic()] static Microsoft.Office.Interop.Word.Application wordObj = null; public Form1() { InitializeComponent(); } public bool OpenDoc(string documentName) { bool bSuccss = false; System.Threading.Thread newThread; int iRetryCount; int iWait; int pid = 0; int iMaxRetry = 3; try { iRetryCount = 1; TRY_OPEN_DOCUMENT: iWait = 0; newThread = new Thread(() => OpenDocument(documentName, pid)); newThread.Start(); WAIT_FOR_WORD: Thread.Sleep(1000); iWait = iWait + 1; if (iWait < 60) //1 minute wait goto WAIT_FOR_WORD; else { iRetryCount = iRetryCount + 1; newThread.Abort(); //'----------------------------------------- //'killing unresponsive word instance if ((wordObj != null)) { try { Process.GetProcessById(pid).Kill(); Marshal.ReleaseComObject(wordObj); wordObj = null; } catch (Exception ex) { } } //'---------------------------------------- if (iMaxRetry >= iRetryCount) goto TRY_OPEN_DOCUMENT; else goto WORD_SUCCESS; } } catch (Exception ex) { bSuccss = false; } WORD_SUCCESS: return bSuccss; } private bool OpenDocument(string docName, int pid) { bool bSuccess = false; Microsoft.Office.Interop.Word.Application tWord; DateTime sTime; DateTime eTime; try { tWord = new Microsoft.Office.Interop.Word.Application(); sTime = DateTime.Now; wordObj = new Microsoft.Office.Interop.Word.Application(); eTime = DateTime.Now; tWord.Quit(false); Marshal.ReleaseComObject(tWord); tWord = null; wordObj.Visible = false; pid = GETPID(sTime, eTime); //now do stuff wordObj.Documents.OpenNoRepairDialog(docName); //other code if (wordObj != null) { wordObj.Quit(false); Marshal.ReleaseComObject(wordObj); wordObj = null; } bSuccess = true; } catch { } return bSuccess; } private int GETPID(System.DateTime startTime, System.DateTime endTime) { int pid = 0; try { foreach (Process p in Process.GetProcessesByName("WINWORD")) { if (string.IsNullOrEmpty(string.Empty + p.MainWindowTitle) & p.HasExited == false && (p.StartTime.Ticks >= startTime.Ticks & p.StartTime.Ticks <= endTime.Ticks)) { pid = p.Id; break; } } } catch { } return pid; }
Comments