我正在使用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应用程序不同。
答案 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;已存储)