【问题标题】:Does Process.StartInfo.UseShellExecute = true work with Process.WaitForExit()?Process.StartInfo.UseShellExecute = true 是否与 Process.WaitForExit() 一起使用?
【发布时间】:2021-06-29 13:47:58
【问题描述】:

我正在编写一个使用 process.StartInfo.UseShellExecute=true 打开 .mp4 文件的程序。

var p = new Process();
p.StartInfo = new ProcessStartInfo("something.mp4")
{
    UseShellExecute = true
};
p.EnableRaisingEvents = true;
p.Start();
//some code
p.WaitForExit();

但是,当我运行它时,.mp4 文件正在打开但它正在显示

System.InvalidOperationException: '没有进程与此对象关联。'

当它运行WaitForExit() 时。有什么办法可以避免这个问题?

【问题讨论】:

  • p.Start()的返回值是多少?
  • 它返回 false。
  • 当我试图打开 mp4 文件时,p.WaitforExit() 期间会显示 InvalidOperationException。但是,它似乎适用于 .exe。为什么会这样?

标签: c# process


【解决方案1】:

Process.StartInfo.UseShellExecute = true 是否与 Process.WaitForExit() 一起使用?

它可以,但不是在你的场景中。

UseShellExecute(在旧桌面 .NET 版本中默认设置为 true,在 .NET Core 中默认设置为 false)控制 Process 类是否会直接创建进程,或将其委托给 Windows shell。

在后一种情况下,以这种方式使用它的主要原因之一是利用 Windows 文件关联来自动选择要为您指定的文件运行的程序。但是当这种情况发生时,启动的实际进程对Process类是不可用的。

只有当你明确指定应该运行的可执行文件时,你才能在启动它后实际监控进程(当然,如果你正在这样做,你实际上不需要设置UseShellExecutetrue)。

在您的具体示例中,如果您已经知道要使用哪个程序来打开 .mp4 文件,则可以更改进程启动信息,以便为 ProcessStartInfo.FileName 属性提供该程序的名称,然后要在 Arguments 属性中打开的 .mp4 文件。当然,这假设您要使用的程序在运行时接受文件名参数,但媒体播放器类型的程序通常是这种情况。

例如,如果您想使用 Windows Media Player 播放 .mp4 文件,您可以执行以下操作:

p.StartInfo = new ProcessStartInfo
{
    FileName = @"C:\Program Files (x86)\Windows Media Player\wmplayer.exe",
    Arguments = @"something.mp4",
    UseShellExecute = false, // Not needed on .NET Core, since that's already the default
};

请注意,您实际上可能需要指定文件的完整路径,而不仅仅是文件名,具体取决于进程最终启动的工作目录以及您尝试启动的程序如何处理该目录。但作为一个例子,我发现 Windows Media Player 在启动进程时会忽略设置的工作目录,并且将无法找到并开始播放您指定的文件,除非您提供文件的完整路径。

其他媒体播放器的行为可能类似,也可能不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 2011-08-17
    • 2012-04-13
    • 2018-12-15
    • 2012-03-09
    • 2020-01-04
    • 1970-01-01
    相关资源
    最近更新 更多