2011-03-11 55 views
5

我正在为Media Center(Windows 7附带的版本)编写一个加载项,并且想要检索用户包含在媒体库中的物理目录列表(图片,视频,录制电视,电影,音乐)。获取Windows Media Center库中包含的目录

Media Center对象模型(Microsoft.MediaCenter.*)似乎没有任何条款来获取此信息。

注册表在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Media Center\MediaFolders处有一个密钥,但它们总是空的。

%userprofile%\AppData\Local\Microsoft\Media Player\wmpfolders.wmdb中似乎有完整的目录列表,但无法分辨每个目录与哪个媒体库相关,因为这些是Media Player的设置,它们的存在可能只是巧合。

没有人知道如何可靠从该加载组件内检索这些目录的列表,优选地(即使用C#)?

+0

嗯,一个问题就是这些媒体库可能是播放列表?我从来没有习惯图书馆或播放列表,但我想他们可能是同一件事。还有一个[库连接](http://msdn.microsoft.com/en-us/library/dd562425(v = VS.85).aspx)也许检查出来。 – 2011-03-16 04:42:18

+0

@Reza播放列表似乎被媒体播放器和媒体中心视为一个单独的概念。目前还不清楚Shell Libraries是否与Media Center Libraries相对应,因为它们仅在Windows 7中引入,并且我确信Vista Media Center仍然有我在我的问题中引用的概念。 – 2011-03-16 05:04:44

+0

我会附加绕道到MediaCenter进程并查看哪些注册表值或配置文件正在被它访问。这可能会提供一些提示。 – 2011-03-16 06:34:10

回答

3

我用反射器在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); 
+0

哇,我印象深刻!我会把它给测试,让你知道我如何得到:) – 2011-03-16 23:54:53

+0

它的工作原理,谢谢!仅供参考,我将'DllImport'位置更改为相对路径(如果Windows未安装在驱动器C上),并为eHome \ WoW中的32位版本添加了第二次导入,如果第一次抛出BadImageFormatException '。 – 2011-03-17 03:20:33

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 
} 

这是一种间接的方式,但可以让您建立所需的目录列表。有关更多信息,请参阅http://msdn.microsoft.com/en-us/library/ee525804.aspx

+0

这是否可以非交互方式完成,或者获取'ListMakerItem'是否必须涉及用户? – 2011-03-16 18:11:17