同时跟踪多个进程

本文关键字:进程 跟踪 | 更新日期: 2023-09-27 17:54:19


我有一个应用程序(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);
    }

似乎正在运行的进程正在停止我自己的进程。。并且由于停止,它将删除该文件,或者它将在尝试删除该文件时生成错误
你对我如何打开自己的流程有什么建议吗?问题是我不知道我必须打开什么类型的文件(可以是任何文件(,我指望窗口来选择最好的应用程序。从我的测试来看,notepad可以正常工作,但winword和acrobat关闭了我的进程
感谢

同时跟踪多个进程

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

一位客户希望获得有关监视资源管理器窗口生存期的帮助。

">我们想启动一个资源管理器副本来打开一个特定的文件夹,然后等到用户关闭文件夹后再继续。我们尝试在命令行上用文件夹启动Explorer的副本,然后在进程句柄上执行Wait­For­Single­Object,但等待有时会立即完成,而不需要等待。我们如何等待用户关闭资源管理器窗口";

这是另一种解决问题半途而废的情况。

Wait­For­Single­Object立即返回的原因是Explorer是一个单实例程序(好吧,有限实例(。当您打开一个资源管理器窗口时,请求会被传递给一个正在运行的资源管理器副本,并且您启动的资源管理者副本会退出。这就是为什么您的Wait­For­Single­Object会立即返回。

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

当你描述";运行过程正在停止我自己的";。因为第二个实例在您启动后会立即关闭,所以Exited事件会被引发,您的代码会告诉它删除文件!

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

在启动流程之前,您应该将Process.StartInfo.UseShellExecute设置为true,就像_OpenFileProces.StartInfo.UseShellExecute = true;一样,然后它应该可以工作了,我认为。。。