首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Process.StartInfo.UseShellExecute = Process.WaitForExit()是否有效?

Process.StartInfo.UseShellExecute = Process.WaitForExit()是否有效?
EN

Stack Overflow用户
提问于 2021-06-29 13:47:58
回答 1查看 554关注 0票数 0

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

代码语言:javascript
复制
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()时。有什么办法可以避免这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 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文件,您可以这样做:

代码语言:javascript
复制
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在启动进程时会忽略工作目录集,并且将无法找到并开始播放您指定的文件,除非您提供了该文件的完整路径。

其他媒体播放器可能也可能没有类似的行为。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68180006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档