需要一些帮助。我创建了一个可以打开多个 Word 文档的桌面应用程序。 但在这里我面临一个问题,当第二个文档打开时,第一个文档的退出事件会触发,而不会关闭该文档。
以下是我的代码:
private void CreateNewProcessForEachDocument()
{
try
{
docProcess = new Process();
docProcess.StartInfo = new ProcessStartInfo(
string.Concat(folderPath, fileName));
docProcess.EnableRaisingEvents = true;
docProcess.Exited += new EventHandler(docProcess_Exited);
docProcess.Start();
docProcess.WaitForExit();
docProcess.Close();
}
catch (Exception ex)
{
throw ex;
}
}
private void docProcess_Exited(object sender, EventArgs e)
{
try
{
var client = new ValidateClientClient();
byte[] fileData = File.ReadAllBytes(string.Concat(folderPath, fileName));
bool fileSaved = client.SaveDocument(fileData, fileName, username);
string filePath = Path.GetFullPath(string.Concat(folderPath, fileName));
if (fileSaved && File.Exists(filePath))
{
File.Delete(filePath);
}
}
catch (Exception ex)
{
throw ex;
}
}
当打开现有的 Word 实例时,它会重用该实例。一个短暂的进程是启动,它除了告诉现有实例打开另一个文档之外什么也不做。因此,您无法可靠地等待 Word 退出。
也许您使用 Office COM 对象模型会更幸运。
或者,您可以使用
Process.GetProcessesByName
获取所有现有的 Word 实例。
您忘记将退出事件与侦听器方法绑定。 将其添加到您的代码中:
docProcess.Exited += new EventHandler(docProcess_Exited);
更新: 如果您只是在button_click上调用CreateNewProcessForEachDocument(),那么您的应用程序就像一个简单的单线程应用程序一样工作,就像您启动新线程一样,您会等到它完成然后继续。 看起来你需要这个:
private void CreateNewProcessForEachDocument()
{
var docProcess = new Process {StartInfo = new ProcessStartInfo("cmd.exe"), EnableRaisingEvents = true};
docProcess.Exited += docProcess_Exited;
docProcess.Start();
}
考虑到提出这个问题已经过去很多年了, 我正在为可能遇到同样问题的其他人提供此信息。 当您打开 Word 文档并再次运行该进程时,它会创建一个具有新 ID 的新进程。此实例立即转移到已打开的 Word 文档,导致触发“Exited”事件,即使 Word 文档实际上并未关闭。 但是,当您通过单击原始文件打开 Word 文档时,不会出现此问题。 为了防止出现此问题,您需要强制它使用新实例打开。 这是示例代码:
private async void StartWord()
{
try
{
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "WINWORD",
Arguments = $"/x {_FilePath}" ,
UseShellExecute = true
},
};
process.Exited += new EventHandler(docProcess_Exited);
process.Start();
await process.WaitForExitAsync();
}
catch (Exception ex)
{
NotifyUser("Error starting process: " + ex.Message);
}
}