2

情况:

  1. 我依靠默认的关联处理程序为各种文件类型(图片、Word 文档等)生成进程。这意味着我只将特定文件名指定为 StartInfo.FileName,并且在该文件名之前没有实际的可执行文件。同时我指定 StartInfo.UseShellExecute = true。这样,与该文件类型相关的软件就会启动。
  2. 我的目标是在该进程退出时得到通知。


Process process = new Process();
try
{
    process.StartInfo.UseShellExecute = true;
    process.StartInfo.FileName = pFullPath;
    process.StartInfo.CreateNoWindow = true;
    process.StartInfo.RedirectStandardError = true;
    bool notReused = process.Start();
}
catch (Win32Exception ex)

变化:

  • Process 的静态 Start 方法确实返回了一个 Process,但我为我的场景返回了 null/空对象。所以这就是为什么我显式地实例化一个 Process 类,为其 StartInfo 属性设置参数,然后最后调用非静态 Start(),这样我就拥有了那个 Process 对象实例。
  • 如果我说 StartInfo.UseShellExecute = false,我会得到一个异常,因为我没有指定可执行文件名。这似乎是调用具有文件类型的关联程序的方式。
  • 非静态 Process.Start 有一个布尔返回值,它表示系统重用了一个 Process。我不想这样,但我不知道如何避免它。
  • 我尝试设置 StartInfo 的 Redirect* 布尔值,但这会再次引发 InvalidOperationException,并且符合文档。

如果我有一个“好”的 Process 对象,我可以连接 Exited 处理程序并将 EnableRaisingEvents 设置为 true。我很惊讶,也很难过这样的 PITA。

4

1 回答 1

2

这是完全不可能的。
根本不保证启动文件会创建进程。

Raymond Chen 有更多的细节

于 2013-04-03T03:26:24.140 回答