Word互操作 - 如何关闭一个Word窗口而不关闭所有窗口?

5
我正在使用Microsoft Word主要互操作程序集来从属于MS Word。我的应用程序会打开一个自己的Word窗口(使用Microsoft.Office.Interop.Word.Application实例)。在应用程序完成其任务后,我想关闭我打开的Word窗口,但我不想影响用户可能打开的其他Word窗口。如果我使用Application.Quit,那么所有Word窗口最终都会关闭。如果我使用Application.ActiveWindow.Close,则Word文档会关闭,但我创建的Word窗口仍然保持打开状态,显示一个空白屏幕,这是不可取的。
如何通过Word API告诉Word关闭我打开的Word实例,而不影响其他实例? 这类似于单击Word窗口右上角的X的行为。
2个回答

4
我知道这个解决方法有点晚,但对我很有效;
在创建Word应用程序对象时,先创建一个临时的Word对象,先打开它,然后再打开你的正式Word文档...最后关闭临时的那个。
这可能看起来浪费了空间和内存,但这样做可以确保你创建的winword.exe保持独立,新创建的Word文档不会与你的文档关联。
Private sub OpenWord()

Dim MyWord as Object
Dim MyTempWord as Object

//I use the CreateObject in my application, but this will be however 
//you declare your word application 

MyTempWord = CreateObject("Word.Application")
MyWord = CreateObject("Word.Application")
MyTempWord.Quit(SaveChanges:=0)


//*Carry on doing whatever your app does*

//*After Finishing App stuff Close it...*

     If MyWord IsNot Nothing Then
        MyWord.Quit(SaveChanges:=0)
        Marshal.FinalReleaseComObject(MyWord)
    End If

End Sub

为了重现这个问题,我必须在我的应用程序中打开Word,并通过快捷方式(Microsoft Office Word)打开另一个Word。当我的应用程序调用MyWord.Quit()时,它会关闭两个文档实例。问题是新建的文档钩入了您的应用程序创建的WINWORD.EXE,因此当您关闭应用程序时,它会关闭其他文档(即使它们出现在不同的实例中)。
我花了很长时间才修复,希望能帮助其他人!

对我来说可行,但无法理解其背后的逻辑。 - m2pathan
我也遇到了一个问题,就是隐藏的单词处理会在打开新文档时关闭用户可能已经打开的活动单词窗口。这个解决方案解决了所有问题。再次感谢。 - R. StackUser

0

使用 Word.Application.Quit()Marshall.FinalReleaseComObject(Word.Application),我能够同时打开多个 Word 实例,并且只关闭我想要关闭的特定实例。

以下是一个快速示例代码(来自 C# 控制台应用程序):

using System.Runtime.InteropServices;
using Microsoft.Office.Interop.Word;

namespace WordTest
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var p = new Program();
            p.Test();
        }

        public void Test()
        {
            var msWord = new Application();

            CloseWord(msWord);
        }

        public void CloseWord(Application word)
        {
            if (word != null)
            {
                word.Quit();
                Marshal.FinalReleaseComObject(word);
            }
        }
    }
}

另请参阅:c# MSOffice Interop Word无法终止winword.exe


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接