c# - 同时跟踪多个进程

标签 c# .net windows process process.start


我有一个应用程序 (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 关闭了我的进程。
谢谢

最佳答案

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

A customer wanted help with monitoring the lifetime of an Explorer window.

"We want to launch a copy of Explorer to open a specific folder, then wait until the user closes the folder before continuing. We tried launching a copy of Explorer with the folder on the command line, then doing a Wait­For­Single­Object on the process handle, but the wait sometimes completes immediately without waiting. How do we wait until the user closes the Explorer window?"

这又是一个问题解决了一半,另一半就麻烦了。

WaitForSingleObject 立即返回的原因是 Explorer 是一个单实例程序(嗯,有限实例)。当您打开 Explorer 窗口时,请求将传递给正在运行的 Explorer 副本,并且您启动的 Explorer 副本会退出。这就是您的 WaitForSingleObject 立即返回的原因。

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

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

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

关于c# - 同时跟踪多个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5831844/

相关文章:

c# - 将 System.Double 表示为可排序字符串的最佳方式是什么?

c# - 关于LINQ中对象长度的问题

c# - 如何全局检测点击(触摸输入)而不是鼠标点击?

c# - UWP Ctrl+F 实现

java - 在 Windows 上使用 Java 代替 pngcrush 优化 iPhone 的 PNG 格式

c# - 无法在 IEnumerable<T> 上找到查询模式的实现

javascript - 如何在 C# 服务器端处理从 jQuery POST 发送的参数?

c# - 使用 .net 成员(member)提供程序进行编程登录

C++ Windows显示游戏中加载菜单的现有目录列表

c# - 如何使用 C# 检查与文件扩展名关联的程序是否有效?