1


我有一个应用程序(winforms)将文件下载到用户的临时文件夹,然后打开文件供用户查看内容,当文件关闭时,文件将从临时文件夹中删除。如果我打开一个 .pdf 和一个 .doc,则应用程序运行正常 如果另一个 winword 进程仍在运行,则在尝试打开一个 .doc 时出现问题(无论是由我的应用程序打开还是由用户直接打开) .

我正在使用以下代码:

_OpenFileProces = System.Diagnostics.Process.Start(TempFileName);
_OpenFileProces.EnableRaisingEvents = true;
_OpenFileProces.Exited += new EventHandler(_OpenFileProces_Exited);

这个是清除温度的

void _OpenFileProces_Exited(object sender, EventArgs e)
    {
        string s = ((System.Diagnostics.Process)sender).StartInfo.FileName;
        System.IO.File.Delete(s);
    }

似乎正在运行的进程正在停止我自己的进程。由于停止它会删除文件,或者在尝试删除文件时会产生错误。
您对我如何打开自己的流程有什么建议吗?问题是我不知道我必须打开什么文件类型(可以是任何文件),我指望 Windows 来选择最好的应用程序。根据我的测试,记事本工作正常,但 winword 和 acrobat 关闭了我的进程。
谢谢

4

2 回答 2

2

我怀疑 Microsoft Word 在这里做的事情与 Raymond Chen 描述的 Windows Shell 在这里做的完全一样:

一位客户在监控资源管理器窗口的生命周期方面需要帮助。

"我们想要启动资源管理器的副本以打开特定文件夹,然后等到用户关闭该文件夹后再继续。我们尝试在命令行上使用该文件夹启动资源管理器的副本,然后在进程句柄上执行 WaitForSingleObject,但是等待有时会立即完成而无需等待。我们如何等到用户关闭资源管理器窗口

这又是一个半路解决问题,另一半遇到麻烦的情况。

立即返回的原因Wait­For­Single­Object是 Explorer 是一个单实例程序(嗯,有限实例)。当您打开资源管理器窗口时,请求将移交给资源管理器的运行副本,并且您启动的资源管理器副本退出。这就是您Wait­For­Single­Object立即退货的原因。

在您的情况下,Word 已经在运行,因此当您创建第二个Word 进程并指示它打开您的文档时,它只是将请求交给已经运行的 Word 实例,并立即退出您启动的第二个进程。

这就是您在描述“正在运行的进程正在停止我自己的进程”时所看到的。因为第二个实例在您启动后立即关闭,所以Exited引发了事件并且您的代码告诉它删除文件!

您敏锐地观察到记事本(与 Word 和 Adob​​e Acrobat 不同)工作得很好。那是因为记事本被设计成一个多实例应用程序。您可以根据需要打开任意数量的记事本;它不在乎桌面上是否已经打开了 1 个或 6 个副本。更重要的是,要求 shell 在记事本中打开文本文档实际上会打开记事本应用程序的第二个副本,而不是向第一个实例发送请求以打开新文档的新窗口。

于 2011-04-29T12:56:41.513 回答
1

您应该在开始流程之前将 Process.StartInfo.UseShellExecute 设置为true这样_OpenFileProces.StartInfo.UseShellExecute = true;,然后我认为它应该可以工作......

于 2011-04-29T12:23:35.367 回答