C# 为什么Process.Start(string)为WMV文件返回null

C# 为什么Process.Start(string)为WMV文件返回null,c#,process,wmv,C#,Process,Wmv,所以我有一个WMV视频文件: var fileName = @"C:\MyFolder\MyVideo.WMV" 我正在启动视频并用代码获取进程ID: var process = Process.Start(fileName); if (process != null) { processId = process.Id; } 虽然我的视频文件已启动,进程始终为空 从中我可以看出: 返回值类型: 系统诊断过程 一个新的过程是 与流程资源关联,如果没有流程资源,则为n

所以我有一个WMV视频文件:

var fileName = @"C:\MyFolder\MyVideo.WMV"
我正在启动视频并用代码获取进程ID:

var process = Process.Start(fileName);
if (process != null)
{
    processId = process.Id;
}
虽然我的视频文件已启动,
进程
始终为空

从中我可以看出:

返回值类型:

系统诊断过程

一个新的过程是 与流程资源关联,如果没有流程资源,则为null 开始了。注意,一个新的过程已经开始了 同一进程的运行实例将独立于 其他的。此外,Start可能会返回一个非null进程及其 ProcessHasExited属性已设置为true。在这种情况下 已启动的进程可能已激活其自身的现有实例,并且 然后退出

如果没有启动新进程,则返回null。但我的进程已启动,仍然返回null。为什么会这样?

因为您无法“启动WMV文件”。在您的场景中,您依赖OS文件扩展名处理程序映射来调用默认应用程序来处理它

更新

从MSDN文档:

使用此重载可通过指定进程资源的文件来启动进程资源 名称重载将资源与新进程相关联 组成部分。如果进程已在运行,则不需要其他进程 资源已启动。而是重用现有的流程资源 并且不会创建新的流程组件。在这种情况下 返回一个新的流程组件时,Start会将null返回给调用 程序

是否有可能某个负责将您的媒体内容请求定向到已注册应用程序以进行扩展的操作系统gizmo已经在运行?我认为很可能,因为从逻辑上讲它应该是explorer.exe,它总是处于运行状态

更新2

以下是使用Process.Start开始播放WMV文件后SysInternals的屏幕截图


正如您所看到的,wmplayer在svchost.exe的控制下打开,因此在您请求WMV文件时,svchost已经启动,因此启动,根据设计返回null。PPT,或者更确切地说是PowerPoint,将在一个单独的过程中打开,而不是在svchost的控制下。

这并不能真正回答问题。如果我启动了一个powerpoint文件,这个过程返回的很好,我可以得到ID?@user1,实际上是这样。媒体播放器可能已经打开。运行最小化到任务栏将被视为已打开。在调用
进程之前,您应该使用任务管理器检查正在运行的应用程序列表。启动
以查看发生了什么。@PanagiotisKanavos否。即使您关闭media player并再次启动它,它也会返回
null
,尽管新进程已启动。媒体文件可以在许多容器中播放,PPT需要特定的应用程序。要确认@SriramSakthivel的评论,在调用
Start
时没有运行Windows Media Player实例。当然,所有文件都使用操作系统文件扩展名处理程序,那么为什么WMV会有所不同呢?例如,我使用Sublimitext notepad打开.txt文件该文件是用哪个应用程序打开的?我的WMV文件是在Windows Media Player中打开的,在我的案例中请参见