在 C# 中枚举 "Godmode"
Enumerate "Godmode" in C#
对于搜索应用程序,我目前正在尝试索引 "Godmode" 特殊文件夹,Windows 包含该文件夹以实现其自身的搜索功能。
使用很棒的 Vanara.Windows.Shell
库,我目前能够为我的桌面建立索引,但是一旦我尝试为 Godmode 文件夹建立索引,枚举就不会产生任何项目。我以管理员用户身份尝试 运行 IDE,但没有解决问题。
这是我目前正在使用的代码:
void Main()
{
Shell32.IShellFolder desktopShellFolder;
Shell32.SHGetDesktopFolder(out desktopShellFolder);
Shell32.PIDL ppidl;
Shell32.SFGAO psfgaoOut;
Shell32.SHParseDisplayName("shell:::{ED7BA470-8E54-465E-825C-99712043E01C}", IntPtr.Zero, out ppidl, (Shell32.SFGAO)0, out psfgaoOut);
var godmodeShellFolder = (Shell32.IShellFolder)desktopShellFolder.BindToObject(ppidl, null, new Guid("000214E6-0000-0000-C000-000000000046"));
CollectSearchItems(godmodeShellFolder, ppidl);
}
void CollectSearchItems(Shell32.IShellFolder shellFolder, Shell32.PIDL pidl)
{
var itemEnum = shellFolder.EnumObjects(IntPtr.Zero, Shell32.SHCONTF.SHCONTF_NONFOLDERS | Shell32.SHCONTF.SHCONTF_FOLDERS);
IntPtr itemId;
uint fetched;
while (itemEnum.Next(1, out itemId, out fetched) == HRESULT.S_OK)
{
Shell32.SFGAO sfgao = Shell32.SFGAO.SFGAO_FOLDER | Shell32.SFGAO.SFGAO_STREAM | Shell32.SFGAO.SFGAO_LINK;
shellFolder.GetAttributesOf(1, new IntPtr[] { itemId }, ref sfgao);
if ((sfgao & Shell32.SFGAO.SFGAO_FOLDER) == 0)
{
var childPidl = new Shell32.PIDL(itemId);
var itemName = shellFolder.GetDisplayNameOf(childPidl, Shell32.SHGDNF.SHGDN_INFOLDER | Shell32.SHGDNF.SHGDN_NORMAL);
}
}
}
如果我更换
CollectSearchItems(godmodeShellFolder, ppidl);
和 CollectSearchItems(desktopShellFolder, ppidl);
我可以成功枚举我的桌面,所以我认为我非常接近...
为什么枚举 Godmode 文件夹不起作用,我该如何解决这个问题?
我找到了两个解决方案:
- 运行 我的应用程序处于 x64/AnyCPU 模式而不是 x86,现在枚举器实际上找到了元素,我可以查询它们的名称。这给了我预期的结果。
- 来自@SimonMourier 的解决方案。这段代码简单多了而且效果很好!
对于搜索应用程序,我目前正在尝试索引 "Godmode" 特殊文件夹,Windows 包含该文件夹以实现其自身的搜索功能。
使用很棒的 Vanara.Windows.Shell
库,我目前能够为我的桌面建立索引,但是一旦我尝试为 Godmode 文件夹建立索引,枚举就不会产生任何项目。我以管理员用户身份尝试 运行 IDE,但没有解决问题。
这是我目前正在使用的代码:
void Main()
{
Shell32.IShellFolder desktopShellFolder;
Shell32.SHGetDesktopFolder(out desktopShellFolder);
Shell32.PIDL ppidl;
Shell32.SFGAO psfgaoOut;
Shell32.SHParseDisplayName("shell:::{ED7BA470-8E54-465E-825C-99712043E01C}", IntPtr.Zero, out ppidl, (Shell32.SFGAO)0, out psfgaoOut);
var godmodeShellFolder = (Shell32.IShellFolder)desktopShellFolder.BindToObject(ppidl, null, new Guid("000214E6-0000-0000-C000-000000000046"));
CollectSearchItems(godmodeShellFolder, ppidl);
}
void CollectSearchItems(Shell32.IShellFolder shellFolder, Shell32.PIDL pidl)
{
var itemEnum = shellFolder.EnumObjects(IntPtr.Zero, Shell32.SHCONTF.SHCONTF_NONFOLDERS | Shell32.SHCONTF.SHCONTF_FOLDERS);
IntPtr itemId;
uint fetched;
while (itemEnum.Next(1, out itemId, out fetched) == HRESULT.S_OK)
{
Shell32.SFGAO sfgao = Shell32.SFGAO.SFGAO_FOLDER | Shell32.SFGAO.SFGAO_STREAM | Shell32.SFGAO.SFGAO_LINK;
shellFolder.GetAttributesOf(1, new IntPtr[] { itemId }, ref sfgao);
if ((sfgao & Shell32.SFGAO.SFGAO_FOLDER) == 0)
{
var childPidl = new Shell32.PIDL(itemId);
var itemName = shellFolder.GetDisplayNameOf(childPidl, Shell32.SHGDNF.SHGDN_INFOLDER | Shell32.SHGDNF.SHGDN_NORMAL);
}
}
}
如果我更换
CollectSearchItems(godmodeShellFolder, ppidl);
和 CollectSearchItems(desktopShellFolder, ppidl);
我可以成功枚举我的桌面,所以我认为我非常接近...
为什么枚举 Godmode 文件夹不起作用,我该如何解决这个问题?
我找到了两个解决方案:
- 运行 我的应用程序处于 x64/AnyCPU 模式而不是 x86,现在枚举器实际上找到了元素,我可以查询它们的名称。这给了我预期的结果。
- 来自@SimonMourier 的解决方案。这段代码简单多了而且效果很好!