首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何关闭正在运行的Word文档实例?(C#)

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

Stack Overflow用户
提问于 2011-09-16 13:58:53
回答 4查看 27.3K关注 0票数 8

我可以看到许多非常相似的线索,但似乎没有给我一个解决方案,应该是非常基本的。

在我的winforms应用程序中,我需要关闭一个正在运行的word文档实例(从应用程序本身打开)。打开应用程序中的word文档时,我会将其记录在列表中。现在我怎么才能关闭同一个医生?

以下是我尝试过的:

代码语言:javascript
复制
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 (我不明白)。

最理想的方法是什么?谢谢..

编辑:

  1. I不能关闭整个单词应用程序(WinWord),因为用户可能会打开其他单词文件。
  2. ,我只需要终止单词实例(类似Process.Kill()),而不需要任何提示用户保存或不保存等等。
EN

Stack Overflow用户

发布于 2012-11-14 08:53:07

我知道为时已晚,但我发现这个话题是因为我有同样的问题。

我的解决方案可能会对其他人有所帮助。

上面的解决方案效果不佳,因为它杀死了Word的每个运行实例,尽管它不是由c#程序打开的,而是由用户打开的。

所以这并不是那么友好的用户。

我的代码检查Word.Application对象在c#中创建之前/之后的进程,并在List<int>中写入WINWORD进程的in,然后比较两个List<int>中的值。当在两个processID中都找不到一个List<int>时,它就会用这个ID杀死进程。

代码语言:javascript
复制
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.Application之前,一次在创建之后)。

代码语言:javascript
复制
 List<int> processesbeforegen = getRunningProcesses();
 // APP CREATION/ DOCUMENT CREATION HERE...
 List<int> processesaftergen = getRunningProcesses();

然后运行killProcesses(processesbeforegen, processesaftergen);

代码语言:javascript
复制
 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();
        }
    }
 }
票数 1
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7445831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档