为什么Windows Media Player不能用player.Close()方法关闭?

问题描述:

我在简单的控制台应用程序中创建媒体播放器对象,播放某个文件。虽然媒体播放器已成功启动,但在使用close()方法时,该过程仍在运行,媒体播放器窗口未关闭。需要做什么?这里是我写的代码..为什么Windows Media Player不能用player.Close()方法关闭?

WindowsMediaPlayer player= new WindowsMediaPlayer(); 
player.OpenPlayer("c:\\abc.wmv"); 
Thread.Sleep(2000); 
player.controls.stop(); 
player.close(); 

在这里进程不会退出并且文件仍然继续运行。我如何关闭应用程序?

+0

是的.close()不会这样做。根据文档,“这种方法关闭了当前的数字媒体文件,而不是Windows Media Player本身”。 http://msdn.microsoft.com/en-us/library/windows/desktop/dd562399%28v=vs.85%29.aspx我似乎无法找到任何其他退出进程。 – bschultz 2012-01-27 22:04:38

+0

我不确定这是否可行,但请尝试Environment.Exit(exitCode)。确保你有SecurityPermissionFlag.UnmanagedCode权限。就像我说的,我不知道它是否会起作用,但值得一试。 – bschultz 2012-01-27 22:23:56

我想你需要通过调用Marshal.ReleaseComObject关闭COM对象。 COM不知道你永远不会再使用该播放器,所以它不能关闭该过程。

不要依赖垃圾收集,因为如果没有内存压力,它可能永远不会发生。手动调用Marshal.ReleaseComObject。

+0

我也试过。它仍然没有退出这个过程。媒体播放器窗口仍然运行该文件。不知道为什么stop()方法在上述场景中也不起作用。但是,我尝试了其他stop()方法。像Player.URL =“c:\\ abc.wmv”; player.controls.play(); player.controls.stop();但这里的问题是没有显示窗口。我只能听到音频 – satya 2012-01-27 22:03:24

+0

您需要处理_all_ COM对象。也许你有一个像player.playlist这样的子对象呢?你曾经访问过的任何东西都会成为这个问题的原因。尝试调用GC.Collect()和GC.WaitForPendingFinalizer()并查看问题是否消失。 – usr 2012-01-27 22:06:14

+0

试试这个:Marshal.ReleaseComObject(new WindowsMediaPlayer())。该过程是否仍然没有退出? – usr 2012-01-27 22:06:48

自动化界面没有办法强制玩家退出。不太理想的方法是杀死它:

 var prc = Process.GetProcessesByName("wmplayer"); 
     if (prc.Length > 0) prc[prc.Length - 1].Kill(); 

更好的捕鼠器是给玩家嵌入到您自己的GUI,容易做到的WinForms。