как закрыть запущенный экземпляр документа Word? (С#)
Я мог видеть много очень похожих нитей вокруг, но ничто не дает мне решения, которое должно быть очень основным.
из моего приложения winforms мне нужно закрыть запущенный экземпляр документа word (открытый из самого приложения). Когда я открываю документ word из приложения, я отслеживаю его в списке. Теперь, как я могу закрыть тот же док?
вот что я пробовал:
private bool CloseWord(string osPath) //here I pass the fully qualified path of the file
{
try
{
Word.Application app = (Word.Application)Marshal.GetActiveObject("Word.Application");
if (app == null)
return true;
foreach (Word.Document d in app.Documents)
{
if (d.FullName.ToLower() == osPath.ToLower())
{
d.What? //How to close here?
return true;
}
}
return true;
}
catch
{
return true;
}
}
Я получаю много методов для документа объект, но только .Close()
чтобы закрыть, который имеет такие аргументы:ref object SaveChanges, ref object OriginalFormat, ref object RouteDocument
чего я не понимаю.
каков идеальный способ? Спасибо..
Edit:
Я не могу закрыть все приложение Word (WinWord), поскольку у пользователей могут быть открыты другие файлы word.
мне нужно просто завершить экземпляр Слова (что-то вроде
Process.Kill()
) без каких-либо подсказок для пользователя, чтобы сэкономить или нет и т. д.
4 ответов
это решение получено от здесь решает.
Word.Application app = (Word.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
if (app == null)
return true;
foreach (Word.Document d in app.Documents)
{
if (d.FullName.ToLower() == osPath.ToLower())
{
object saveOption = Word.WdSaveOptions.wdDoNotSaveChanges;
object originalFormat = Word.WdOriginalFormat.wdOriginalDocumentFormat;
object routeDocument = false;
d.Close(ref saveOption, ref originalFormat, ref routeDocument);
return true;
}
}
return true;
Как насчет использования чего-то вроде:
Изменено Из:http://www.dreamincode.net/code/snippet1541.htm
public static bool KillProcess(string name)
{
//here we're going to get a list of all running processes on
//the computer
foreach (Process clsProcess in Process.GetProcesses())
{
if (Process.GetCurrentProcess().Id == clsProcess.Id)
continue;
//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))
{
clsProcess.Kill();
return true;
}
}
//otherwise we return a false
return false;
}
Я знаю, что слишком поздно, но я нашел эту тему, потому что у меня была та же проблема.
и мое решение может помочь другим людям.
решение выше не работает хорошо, потому что он убил каждый запущенный экземпляр Word, хотя он не был открыт программой C#, но пользователем.
так что это было не так уж дружелюбно.
мой код проверяет процессы до/после создания Word.Application
"объект" в C# и записывает идентификаторы WINWORD
Процессы в List<int>
затем он сравнивает значения List<int>
.
Когда processID
не нашел как List<int>
он убивает процесс с этим ID.
public List<int> getRunningProcesses()
{
List<int> ProcessIDs = new List<int>();
//here we're going to get a list of all running processes on
//the computer
foreach (Process clsProcess in Process.GetProcesses())
{
if (Process.GetCurrentProcess().Id == clsProcess.Id)
continue;
if (clsProcess.ProcessName.Contains("WINWORD"))
{
ProcessIDs.Add(clsProcess.Id);
}
}
return ProcessIDs;
}
запустите это дважды (один раз до создания Слова.Применение и один раз после).
List<int> processesbeforegen = getRunningProcesses();
// APP CREATION/ DOCUMENT CREATION HERE...
List<int> processesaftergen = getRunningProcesses();
затем запустите killProcesses(processesbeforegen, processesaftergen);
private void killProcesses(List<int> processesbeforegen, List<int> processesaftergen)
{
foreach (int pidafter in processesaftergen)
{
bool processfound = false;
foreach (int pidbefore in processesbeforegen)
{
if (pidafter == pidbefore)
{
processfound = true;
}
}
if (processfound == false)
{
Process clsProcess = Process.GetProcessById(pidafter);
clsProcess.Kill();
}
}
}
Если вы хотите закрыть все приложение word, вы можете просто позвонить:
Word.Application app = (Word.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
if (app == null)
return true;
app.Quit(false);