在C#中列举“Godmode”

对于搜索应用程序,我目前正在尝试索引 Windows包含的“Godmode”特殊文件夹以用于其自己的搜索功能.

使用伟大的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的解决方案.这段代码更简单,效果很好!

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...