如何关闭正在运行的Word文档实例?(C#)
我可以看到周围有很多非常相似的线索,但似乎没有什么能给我一个应该是非常基本的解决方案 在winforms应用程序中,我需要关闭word文档的运行实例(从应用程序本身打开)。当我从应用程序中打开word文档时,我会在列表中跟踪它。现在如何关闭同一个文档 以下是我尝试过的:如何关闭正在运行的Word文档实例?(C#),c#,c#-2.0,office-automation,running-other-programs,C#,C# 2.0,Office Automation,Running Other Programs,我可以看到周围有很多非常相似的线索,但似乎没有什么能给我一个应该是非常基本的解决方案 在winforms应用程序中,我需要关闭word文档的运行实例(从应用程序本身打开)。当我从应用程序中打开word文档时,我会在列表中跟踪它。现在如何关闭同一个文档 以下是我尝试过的: private bool CloseWord(string osPath) //here I pass the fully qualified path of the file { try { W
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-routeddocument
,我不理解
理想的方法是什么?谢谢
编辑:
Process.Kill()
),而不提示用户是否保存等等使用类似于: 修改自: 这个解决方案是从solves得到的
我知道为时已晚,但我找到了这个话题,因为我有同样的问题 我的解决方案可能会帮助其他人 上面的解决方案没有很好地工作,因为它杀死了Word的每个运行实例,尽管它不是由c程序打开的,而是由用户打开的 所以这不是那么友好 我的代码在c#中创建
Word.Application
对象之前/之后检查进程,并将WINWORD
进程的ID写入List
然后比较两个列表中的值。
当在两个列表中都找不到进程ID
时,它将使用此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;
}
如果要关闭整个word应用程序,只需调用:
Word.Application app = (Word.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
if (app == null)
return true;
app.Quit(false);
Chuck,这个方法通过进程名搜索进程。例如,我的word文件可以有名称(我传递的参数)“C:\doc.doc”,而进程的名称是WINWORD,但不匹配。因此.Kill()永远不会被命中。@nawfal:我也有同样的问题,当我运行该程序时,另一个同名文档处于打开状态(事实上,它在某些情况下未经处理就关闭了),这段代码不起作用,我的意思是,我得到了另一个实例正在运行的错误。正如你所说,我无法关闭整个WinWord.exe,因为用户可能打开了其他word文件。这让我发疯了,我希望您能给我一些帮助。@nawfa:我说的错误是:word无法保存此文件,因为它已经在其他地方打开了。@raha,再问一个问题,然后在这里进一步说明。从这里很难给出解决方案。我所能说的是,您应该使用一些智能代码来处理现有的word实例。请搜索“处理掉单词实例”左右。@nawfal:谢谢,但我已经提出了另一个问题,在互联网上搜索了一整天,但找不到任何解决方案,谢谢。这种方法绝对不应该使用,因为它没有安全性。在两次调用之间可以启动任意数量的进程…如果在创建Word应用程序对象并启动进程之后立即调用第二个方法,则无法启动。是的,可能有一秒的时间间隔,但在这段时间内几乎没有用户会打开另一个Word实例。我仍然认为这是一个不可靠的解决方案。它适用于你在家里做的小项目,但不应该用于任何类型的工业环境,你的第二句话清楚地说明了原因。
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();
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.Application app = (Word.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
if (app == null)
return true;
app.Quit(false);