2011-03-11 11 views
5

Estoy escribiendo un complemento para Media Center (la versión que viene con Windows 7) y quiero recuperar la lista de directorios físicos que el usuario ha incluido en las bibliotecas multimedia (fotos, videos, televisión grabada, películas, música).Obtener directorios incluidos en las bibliotecas de Windows Media Center

El modelo de objetos de Media Center (Microsoft.MediaCenter.*) no parece tener ninguna disposición para obtener esta información.

El registro tiene una clave en HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Media Center\MediaFolders, sin embargo, estos siempre están vacíos.

Parece que hay una lista completa de los directorios en %userprofile%\AppData\Local\Microsoft\Media Player\wmpfolders.wmdb, pero no hay forma de saber a qué biblioteca de medios se refiere cada directorio y, dado que estos son los ajustes para Media Player, su presencia puede ser una coincidencia.

¿Alguien sabe cómo fiable recuperar una lista de estos directorios, preferiblemente desde dentro del conjunto de complemento (es decir, utilizando C#)?

+0

hmm, una pregunta habría aquellas bibliotecas de medios, posiblemente, ser las listas de reproducción? Nunca utilicé las bibliotecas o las listas de reproducción, pero imagino que podrían ser lo mismo. También hay una [Conexión de Biblioteca] (http://msdn.microsoft.com/en-us/library/dd562425 (v = VS.85) .aspx) tal vez verifique eso. –

+0

@Reza Las listas de reproducción parecen ser vistas como un concepto separado tanto por Media Player como por Media Center. No está claro si las Bibliotecas de Shell corresponden a las Bibliotecas de Media Center, ya que solo se introdujeron en Windows 7 y estoy seguro de que Vista Media Center todavía tenía el concepto al que me refiero en mi pregunta. –

+0

Adjuntaré un desvío a los procesos de MediaCenter y veré a qué valores de registro o archivos de configuración se está accediendo. Eso podría proporcionar algunas pistas. –

Respuesta

3

Usé Reflector para ver cómo ehshell hace esto. Para Imágenes, Videos, Música y TV grabada está usando un método importado de ehuihlp.dll. Para Movies, simplemente saca la lista directamente del HKCR\Software\Microsoft\Windows\CurrentVersion\Media Center\MediaFolders\Movie.

Aquí hay un ejemplo de cómo utilizar el método importado:

using System.Runtime.InteropServices;

...

[DllImport(@"c:\Windows\ehome\ehuihlp.dll", CharSet = CharSet.Unicode)] 
static extern int EhGetLocationsForLibrary(ref Guid knownFolderGuid, [MarshalAs(UnmanagedType.SafeArray)] out string[] locations); 

...

Guid RecordedTVLibrary = new Guid("1a6fdba2-f42d-4358-a798-b74d745926c5"); 
Guid MusicLibrary = new Guid("2112ab0a-c86a-4ffe-a368-0de96e47012e"); 
Guid PicturesLibrary = new Guid("a990ae9f-a03b-4e80-94bc-9912d7504104"); 
Guid VideosLibrary = new Guid("491e922f-5643-4af4-a7eb-4e7a138d8174") 

...

string[] locations; 
EhGetLocationsForLibrary(ref PicturesLibrary, out locations); 
+0

¡Guau, estoy impresionado! Lo pondré a prueba y le contaré cómo me llevo :) –

+0

¡Funciona, gracias! FYI, cambié la ubicación 'DllImport' a una ruta relativa (en caso de que Windows no esté instalado en la unidad C) y agregué una segunda importación para la versión de 32 bits en eHome \ WoW) que se activa si la primera arroja' BadImageFormatException '. –

0
private void ListItems(ListMakerItem listMakerItem) 
{ 
    if (listMakerItem.MediaTypes == Microsoft.MediaCenter.ListMaker.MediaTypes.Folder) 
    { 
     // Recurse into Folders 
     ListMakerList lml = listMakerItem.Children; 
     foreach (ListMakerItem listMakerChildItem in lml) 
     { 
      ListItems(listMakerChildItem); 
     } 
    } 
    else 
    { 
     BuildDirectoryList(listMakerItem.FileName) 
    } 
} 

private void BuildDirectoryList(string fileName) 
{ 
    // Parse fileName and build unique directory list 
} 

De forma indirecta, pero le permitiría crear la lista de directorios deseada. Ver http://msdn.microsoft.com/en-us/library/ee525804.aspx para más información.

+0

¿Se puede hacer esto de forma no interactiva o la obtención de un 'ListMakerItem' debe involucrar al usuario? –

Cuestiones relacionadas