2012-04-12 108 views
0

使用.NET Windows Media Player库,我已经能够以编程方式获取和更改Windows Media Player的各种文件属性(如用户评分)。我希望通过调用Player.openPlayer(url)来使用相同的库来控制(播放,停止,下一次等)Windows Media Player实例。理论上来说,这应该是非常有可能通过Player.controls对象,但是当我去访问它们时,没有任何控件可用。除了控件对象之外,几乎所有的播放器属性/方法/事件都可用于我。下面是一些示例代码来说明我已经试过:通过IronPython控制Windows Media Player实例的问题

import clr 
clr.AddReferenceToFile("Interop.WMPLib.dll") 
from Interop.WMPLib import WindowsMediaPlayerClass 
wmp = WindowsMediaPlayerClass() 
wmp.openPlayer(r"C:\Users\Public\Music\Sample Music\Kalimba.mp3") 

这工作得很好,但是当我做到以下几点:

print wmp.controls.isAvailable("play").ToString() 
print wmp.controls.isAvailable("pause").ToString() 
print wmp.controls.isAvailable("stop").ToString() 
... 

我得到每个控制假。为什么这些控件不适用于我的(简单)应用程序?我可能会以这种错误的方式去做?我使用WMP 12,所以它应该比兼容更多。我真的不想使用其他API,但我愿意尝试此时的任何事情。

下面是引用文档:http://msdn.microsoft.com/en-us/library/dd564034%28v=vs.85%29.aspx

编辑:快速修复被持有了,但我仍然没有找到一个实际的解决办法呢。

+0

问题根本不清楚吗? – covertCoder 2012-04-13 13:44:16

+0

不,但这需要一个非常罕见的知识交集 - 您可能是第一个使用IronPython来控制WMP的人。 :)如果忽略'isAvailable'并只调用'play()'会发生什么? – 2012-04-16 22:39:25

+0

没有任何反应,与所有其他控制功能相同。其他函数不会返回错误,但它们也不会执行其预期的功能。我目前的quickfix每次打开一个新的播放列表/媒体文件时都会调用Player.openPlayer,但这通常会让WMP实例闪烁,或者最糟糕的情况下,我会从其他任何我正在做的事情中集中注意力。 – covertCoder 2012-04-17 13:11:10

回答

0

尝试

print wmp.controls.get_isAvailable("play"); 
print wmp.controls.get_isAvailable("stop"); 
etc. 

,但请记住,直到你进入所述WMP控制文件加载这些控件将不可用。

首先将wmp.URL设置为您要播放的文件的路径,然后在完成加载时简单地调用wmp.controls.play();。您可以侦听OpenStateChange事件以确定它是否已加载。

+0

问题是无论我如何加载wmp实例,wmp.controls.play()都不起作用。我试过wmp.URL,wmp.launchURL,wmp.openPlayer等,但wmp.controls。 ()仍然没有做任何事情。另外,wmp.controls.get_isAvailable(“control”)会返回一个错误,可能是因为正确的函数是wmp.controls.isAvailable(“control”),但是之后我再也无法正常工作了。我确定在调用这些控件之前它已经被加载了,但是OpenStateChange也从未触发过这么... – covertCoder 2012-04-18 13:30:22

+0

你是否尝试过侦听'Error','MediaError'或'StatusChange'事件?有事件发生吗?他们可能会帮助追查错误。玩家本身不是'WindowsMediaPlayer'类(没有'class'后缀)? – marmulin 2012-04-19 10:52:18

+0

从我的理解,WindowsMediaPlayer是抽象类和WindowsMediaPlayerClass(在文档中称为播放器)是实际的API。请记住,此API用于编写脚本,并不一定与其他WMP API相同。我试着听过上述事件,但是当我手动或以编程方式使用播放器时,其中没有一个会触发。足以说,这些文档对可以做什么和不可以做什么有点困惑。 – covertCoder 2012-04-23 14:28:20