我正在编写一个使用.mp4打开process.StartInfo.UseShellExecute=true文件的程序。
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()时。有什么办法可以避免这个问题吗?
发布于 2021-06-29 16:38:44
Process.StartInfo.UseShellExecute = true用于Process.WaitForExit()吗?
它是可以的,但在你所拥有的场景中却并非如此。
UseShellExecute (在旧的桌面.NET版本中默认设置为true,在.NET Core默认情况下设置为false )控制Process类是直接创建进程,还是将该进程委托给Windows。
在后一种情况下,使用该方法的主要原因之一是利用Windows文件关联自动选择要为指定的文件运行的程序。但是当发生这种情况时,启动的实际进程对于Process类是不可用的。
只有显式地指定应该运行的可执行文件,才能在进程启动后实际监视它(当然,如果您正在这样做,实际上不需要将UseShellExecute设置为true)。
在您的特定示例中,如果您已经知道要使用哪个程序来打开.mp4文件,则可以更改进程启动信息,以便为ProcessStartInfo.FileName属性提供该程序的名称,然后在Arguments属性中打开.mp4文件。当然,这假设您想要使用的程序在运行时接受文件名参数,但是对于媒体播放器类型的程序通常是这样的。
例如,如果您想使用来播放.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在启动进程时会忽略工作目录集,并且将无法找到并开始播放您指定的文件,除非您提供了该文件的完整路径。
其他媒体播放器可能也可能没有类似的行为。
https://stackoverflow.com/questions/68180006
复制相似问题