我的应用程序从众多音乐播放器中检索当前播放的歌曲.但是,我在实现Zune和Windows Media Player方面遇到了很大麻烦.我已经做了很多关于这个主题的谷歌搜索,不幸的是它只是让我越来越困惑.我通常会为其他应用程序做些...

我的应用程序从众多音乐播放器中检索当前播放的歌曲.但是,我在实现Zune和Windows Media Player方面遇到了很大麻烦.
我已经做了很多关于这个主题的谷歌搜索,不幸的是它只是让我越来越困惑.
我通常会为其他应用程序做些什么:
>每4秒对所有打开的窗口进行迭代
>获取所有窗口的标题
>检查模式的标题(即“ – Spotify”)
>如果有,请调整输出标题.
WMP标题中没有当前播放的歌曲.
Zune确实如此,但它在标题,专辑和艺术家之间每隔几秒钟就会旋转一次.尽管可能,但使用我当前的方法跟踪这是非常不可靠的.
Windows媒体播放器
我也试过在Windows媒体播放器上使用COM组件.
import win32com.client
wmp = win32com.client.gencache.EnsureDispatch('WMPlayer.OCX')
# some function I don't have here, it retrieves the current playing song
# and other data
这个问题需要你以编程方式启动WMP,这对用户来说非常不友好
那么,我发现了什么? This SO post重定向到WMP.dll.但据我所知,它与COM有同样的问题,你必须以编程方式启动它.如果没有,我真的想要如何在python中使用该DLL的一些方向.
还有另外一个不那么hacky的解决方案,即为WMP编写插件,让我的用户下载该插件并从该插件中检索数据.我宁愿不去那里,因为我没有任何C语言的经验,也不想深入研究插件文档.
Zune播放器
一种方法是循环通过三个标题状态,确定它当前处于哪个状态并找到另外两个的位置.
IE:
前5秒标题是:Super_song
接下来的5秒标题是:By Power_artist
接下来的5秒标题是:Good_album(日期)
所以我可以通过制作日期的正则表达式(总是在那里)确定专辑标题的时间,然后等待几秒钟找到标题和艺术家.
这显然不是一个很好的解决方案,因为它需要一段时间而且它也不是非常可靠,(如果歌曲名称包含日期,那该怎么办)
接下来的问题是它也不一致,有时候标题只会持续几分钟.不知道为什么.
所以,继续下一个方法.
有一个名为ZuneNowPlaying的应用程序.这个“不知何故”从Zune获取当前播放的歌曲并将其放入注册表中,这个东西不能用我的草率标题方法,因为它在歌曲改变的瞬间改变了注册表.立即.
这是我在我的程序的工作版本中使用的解决方案,但许多用户报告说它根本不起作用,没有任何反应.我检查了程序,它不能一直可靠地更改注册表.我不知道为什么,我不知道如何解决它.因此,这个解决方案也被包括在内.
Is the fact that it is using the name “MsnMsgrUIManager”#000000”>
causing the zune software to send it information about which song is
playing? Is there a way to get this information without this kind of
hack?
这可以在Zune Now Playing应用程序的讨论中找到.遗憾的是,源代码不可用,至少我找不到它.有人对此有更多了解吗?
我听说过的第三种方法是dll.它被称为ZuneShell.dll.我不记得我在哪里读到它,也不能通过谷歌找到它,因为所有结果都是“ZuneShell.dll是病毒吗?”.
再一次,我遇到了一个问题,我不知道如何使用它,即使我有文档,哎呀,如果它甚至是我一直在寻找的.
可能会考虑的替代方向
在浏览这个主题时,我看到人们谈论直接从GUI中检索数据.我不确定我的记忆是多么合法,可能甚至是多么正确,但是如果有可能有人可以将我重新引导到更多这方面呢?
还有别的,真的.
解决方法:
我在C中使用代码来打印当前在WMP中播放的媒体的名称.这是一个简单的控制台应用程序(78行代码).
脚步:
1)实现了一个实现IUnknown,IOleClientSite,IServiceProvider和IWMPRemoteMediaServices的基本COM对象.使用ATL模板CComObjectRootEx,这很简单(有点,您的里程可能会有所不同).需要(简单)代码的唯一方法是IServiceProvider :: QueryService和IWMPRemoteMediaServices :: GetServiceType.所有其他方法可能返回E_NOTIMPL
2)实例化“WMPlayer.OCX”COM对象(在我的例子中,通过CoCreateInstance)
3)通过QueryInterface从对象中检索IOleObject接口指针
4)从1)中看到的类中实现一个对象(我使用CComObject<> :: CreateInstance模板)
5)使用从3)获得的接口的SetClientSite方法,将指针传递给OleClientSite实现.
6)在SetClientSite调用期间,WMP将回调您:fisrt请求IServiceProvider接口指针,第二次调用QueryService方法,请求IWMPRemoteMediaServices接口指针.返回IWMPRemoteMediaServices的实现,第三,将通过GetServiceType再次调用.然后,您必须返回“远程”.您现在已连接到WMP运行实例
7)查询COM对象以获取IWMPMedia接口指针
8)如果7)没有给出NULL,请阅读IWMPMedia :: name属性.
9)完成
所有上述内容均使用VS2010 / Windows Seven进行测试,并且运行WMP(如果没有运行Media Player进程,则不执行任何操作).
我不知道yoy是否可以/想要在Python中实现COM接口和对象.如果您对我的C代码感兴趣,请告诉我.您可以在C DLL中使用该代码,然后从python中调用它.
本文标题为:需要一种方法从Zune和Windows Media Player使用Python检索当前播放的歌曲


基础教程推荐
- 在python中将数组存储到持久内存的有效方法 2023-11-11
- Numpy安装、升级与卸载的详细图文教程 2022-10-20
- Python+OpenCV实战之实现文档扫描 2022-10-20
- Python实现K-近邻算法的示例代码 2022-10-20
- Python网络活动统计信息Linux 2023-11-15
- 从内存中恢复Python脚本,我搞砸了 2023-11-15
- python可视化大屏库big_screen示例详解 2023-08-11
- Python-另一个编码问题. Windows 8.1,均为最新的python.点引发异常 2023-11-12
- Windows下用PowerShell激活Python的虚拟环境 2023-09-04
- Python文件处理与垃圾回收机制详情 2022-10-20