Word的新实例充当现有托管Word应用程序的子进程

时间:2016-03-17 09:33:46

标签: c# wpf winforms ms-word

我正在使用Word自动化工具,我在WPF窗口中托管Word。我使用以下代码来创建一个新的Word应用程序

    // Initialize handle value to invalid
    appWin = IntPtr.Zero;

    // Start the remote application
    try
        {
            // Start the process
            if (_wordApp == null) _wordApp = new ApplicationClass();
            _wordApp.Application.Caption = WORD_APP_NAME;

            //find the process
            appWin = FindWindow("Opusapp", _wordApp.Application.Caption);
        }
        catch (Exception ex)
        {
            MessageBox.Show(this, ex.Message, "Error");
        }           

        // Put it into this form
        SetParent(appWin, this.Handle);

关闭应用程序我希望所有生成的Word应用程序都被杀死。

    protected override void OnHandleDestroyed(EventArgs e)
    {
        // Stop the application
        if (appWin != IntPtr.Zero)
        {
            // to be sure that the word app closes without trace 
            try
            {
                uint pid;
                uint pid2 = GetWindowThreadProcessId(appWin,out pid);

                Process proc = Process.GetProcessById((int)pid);
                proc.Kill();
            }
            catch (Exception)
            {
                //write logs.
            }
            _wordApp = null;

            // Clear internal handle
            appWin = IntPtr.Zero;
        }
        base.OnHandleDestroyed (e);
    }

问题是,当用户使用此应用程序并并行打开新的Word文档时,新Word将充当当前进程的子进程,因此会终止进程。新的Word应用程序也将关闭。

如何确保我使用的Word应用程序始终与当前运行或稍后打开的任何其他Word应用程序不同。

2 个答案:

答案 0 :(得分:1)

你不需要杀死这个过程。它足以保留您创建的单词Application的引用,然后调用其Quit方法。

例如:

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

Microsoft.Office.Interop.Word.Application word;

private void button1_Click(object sender, EventArgs e)
{
    word = new Microsoft.Office.Interop.Word.Application();
    var documents = word.Documents;
    documents.Open(@"d:\file1.docx");
    SetParent(new IntPtr(word.ActiveWindow.Hwnd), this.Handle);
    word.Visible = true;
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (word != null)
        word.Quit();
}

答案 1 :(得分:0)

您是否可以存储您正在生成的Word实例的进程ID,然后在关闭时仅关闭该进程(使用Process.GetProcesses()迭代正在运行的进程,将它们与您的进程ID匹配#39;已存储)