2012-03-21 12 views
16

Sto tentando di scrivere codice che legge ogni elemento dalla libreria di Windows Media Player dell'utente. Questo codice funziona per la maggior parte degli utenti, ma per alcuni utenti, getAll() restituirà un elenco vuoto quando ha chiaramente centinaia o migliaia di elementi nella libreria di Windows Media Player.WMPLib: player.mediaCollection.getAll(). Count è sempre 0

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

sto riferimento al namespace WMPLib con l'aggiunta di un riferimento COM alla Wmp.dll. La mia applicazione viene fornita con Interop.WMPLib.dll. Come sarebbero configurate le macchine di alcuni utenti in modo tale da far girare Windows Media Player con molti brani nella loro libreria, ma WMPLib non funziona correttamente? Inoltre, quali soluzioni alternative esistono per leggere in modo affidabile la libreria di Windows Media Player dell'utente in tutti i casi?

+2

Se si ha accesso a una macchina da testare, quale valore si ottiene da "Settings.mediaAccessRights'? –

+0

WMPLib non funziona correttamente?, Posso richiedere di postare l'errore? – Soundararajan

+0

In generale le librerie di Interop sono specifiche per una versione di DLL e, se qualcosa cambia nella DLL COM sottostante, sarà necessario disporre della DLL di interoperabilità appropriata. Sai se WMP ... dll è uguale e compatibile tra tutte le versioni di tutte le finestre. Alcune finestre come la serie WIndows 7 N non vengono fornite con Windows Media Player. Inoltre è una buona idea ottenere la configurazione dalle persone che segnalano errori e cercare di trovare i fatti da loro – Soundararajan

risposta

1

Prova questo snippet e verifica se funziona per te.

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; 
} 

Per ulteriori informazioni, fare riferimento a questo eccellente articolo sul progetto di codice. http://www.codeproject.com/Articles/36338/Export-Windows-Media-Player-Music-Metadata-to-XML