2012-03-21 107 views
16

我正在尝试编写从用户的Windows Media Player库中读取每个项目的代码。此代码适用于大多数用户,但对于某些用户,getAll()将在Windows媒体播放器库中明确包含数百或数千个项目时返回空列表。WMPLib:player.mediaCollection.getAll()。count始终为0

var player = new WindowsMediaPlayer(); 
var collection = player.mediaCollection; 
var list = collection.getAll(); 
int total = list.count; 

我通过添加COM引用的Wmp.dll引用WMPLib命名空间。我的应用程序随附Interop.WMPLib.dll。如何配置某些用户的机器,使其运行带有许多歌曲的Windows Media Player,但WMPLib无法正常工作?此外,有什么解决方法可以在所有情况下可靠地读取用户的Windows Media Player库?

+2

如果您碰巧有机会测试,您会从'Settings.mediaAccessRights'获得什么值? – 2012-05-16 19:39:04

+0

WMPLib无法正常运行?请问您是否要求发布失败? – Soundararajan 2012-05-21 21:03:47

+0

一般而言,Interop库特定于DLL的版本,如果底层COM DLL中的某些内容发生更改,则必须具有适当的Interop DLL。你知道如果WMP ... DLL是相同的,并在所有窗口的版本兼容。有些Windows如Windows 7 N系列默认不会随Windows Media Player一起提供。 此外,从报告失败的人那里获取配置并尝试从中找到事实是一个好主意 – Soundararajan 2012-05-21 21:07:18

回答

1

试试这个片段,看看它是否适合你。

public List<MusicEntry> GetMusicLibrary() 
{ 
    List<MusicEntry> entries; 
    IWMPPlaylist mediaList = null; 
    IWMPMedia mediaItem; 

    try 
    { 
    // get the full audio media list 
    mediaList = media.getByAttribute("MediaType", "Audio"); 
    entries = new List<MusicEntry>(mediaList.count); 

    for (int i = 0; i < mediaList.count; i++) 
    { 
     mediaItem = mediaList.get_Item(i); 

     // create the new entry and populate its properties 
     entry = new MusicEntry() 
     { 
     Title = GetTitle(mediaItem), 
     Album = GetAlbum(mediaItem), 
     Artist = GetArtist(mediaItem), 
     TrackNumber = GetTrackNumber(mediaItem), 
     Rating = GetRating(mediaItem), 
     FileType = GetFileType(mediaItem) 
     }; 

     entries.Add(entry); 
    } 
    } 
    finally 
    { 
    // make sure we clean up as this is COM 
    if (mediaList != null) 
    { 
     mediaList.clear(); 
    } 
    } 

    return entries; 
} 

欲了解更多信息,请参阅这篇关于代码项目的优秀文章。 http://www.codeproject.com/Articles/36338/Export-Windows-Media-Player-Music-Metadata-to-XML