Получить каталоги, включенные в библиотеки Windows Media Center
Я пишу надстройку для Media Center (версия, которая поставляется с Windows 7) и хочу получить список физических каталогов, которые пользователь включил в библиотеки мультимедиа (картинки, видео, записанные телепередачи, фильмы, музыка),
Объектная модель Медиа-центра (Microsoft.MediaCenter.*
), похоже, не имеет никаких положений для получения этой информации.
В реестре есть ключ на HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Media Center\MediaFolders
Однако они всегда пусты.
Там, кажется, полный список каталогов в %userprofile%\AppData\Local\Microsoft\Media Player\wmpfolders.wmdb
, но невозможно определить, к какой медиатеке относится каждый каталог, и, поскольку это настройки для Media Player, их присутствие может быть просто случайным.
Кто-нибудь знает, как надежно получить список этих каталогов, предпочтительно из сборки надстройки (например, с помощью C#)?
2 ответа
Я использовал Reflector, чтобы оценить, как это делает ehshell. Для картинок, видео, музыки и записанного ТВ используется импортированный метод из ehuihlp.dll. Для фильмов это просто тянет список прямо из HKCR\Software\Microsoft\Windows\CurrentVersion\Media Center\MediaFolders\Movie
,
Вот пример того, как использовать импортированный метод:
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);
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
}
Это косвенный способ, но он позволит вам создать желаемый список каталогов. См. http://msdn.microsoft.com/en-us/library/ee525804.aspx для получения дополнительной информации.