如何关闭正在运行的Word文档实例?(C#)

如何关闭正在运行的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

我可以看到周围有很多非常相似的线索,但似乎没有什么能给我一个应该是非常基本的解决方案

在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-routeddocument
,我不理解

理想的方法是什么?谢谢

编辑:

  • 我无法关闭整个Word应用程序(WinWord),因为用户可能打开了其他Word文件

  • 我只需要终止word实例(类似于
    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);