c++ - 在新目录上设置可见列

标签 c++ winapi directory com multiple-columns

我正在开发一个可以创建新文件夹的 shell 扩展。我希望新文件夹在用户浏览后在详细信息 View 中显示一组自定义列。我认为 IColumnManager 可能是实现此目的的正确接口(interface)。这是我在创建新文件夹后尝试的代码(我缩写了 PKEY):

IShellFolder* psdf;
if (SUCCEEDED(SHGetDesktopFolder(&psdf))) {

    PIDLIST_ABSOLUTE pidl = ILCreateFromPath(pwszNewFolderPath);

    LPSHELLFOLDER psf;
    if (SUCCEEDED(psdf->BindToObject(pidl, NULL, IID_IShellFolder, (void**)& psf))) {

        SFV_CREATE sfvc = { 0 };
        sfvc.cbSize = sizeof(SFV_CREATE);
        sfvc.pshf = psf;
        sfvc.psvOuter = NULL;
        sfvc.psfvcb = NULL;

        LPSHELLVIEW psv;
        if (SUCCEEDED(SHCreateShellFolderView(&sfvc, &psv))) {

            IColumnManager* pcm;
            if (SUCCEEDED(psv->QueryInterface(IID_IColumnManager, (void**)& pcm))) {

                PROPERTYKEY rgkeys[] = {
                    PKEY_ [...] ,
                    PKEY_ [...] ,
                    PKEY_ [...] ,
                };

                if (SUCCEEDED(pcm->SetColumns(rgkeys, ARRAYSIZE(rgkeys)))) {
                    //MessageBoxA(NULL, "Success?", "Success?", MB_OK);
                }
                pcm->Release();
            }
            psv->Release();
        }
        psf->Release();
    }
    psdf->Release();
}

这段代码成功地执行了每个方法调用,但是当我进入新创建的文件夹时,列不是我想要的。难道我做错了什么? IColumnManager 是否仅在给定文件夹已经可见时才起作用?也许它只适用于 IExplorerBrowser 之类的?如果界面不正确,我如何为用户浏览文件夹时设置一组自定义列?谢谢。

编辑:此代码实际上适用于文件夹的事件 View 。但是,它对列所做的更改不会持续存在(与用户手动进行的列更改不同,后者会持续存在)。所以我想我想知道是否有办法让它们持久存在,或者是否有另一种方法可以在不需要事件 View 的情况下设置列。再次感谢。

此外,SHGetViewStatePropertyBag 可能相关吗?与 IExplorerBrowser::SetPropertyBag 一起?或者那些不能用于常规 shell 文件夹?

最佳答案

SHCreateShellFolderView 创建一个提供给 IShellView 的 shell 实例,这个界面知道如何保存它的设置,但是它向它的 IShellBrowser 主机询问存储实现。 IShellView::CreateViewWindow 将 View 连接到它的宿主。

IShellView::SaveViewState:

Saves the Shell's view settings so the current state can be restored during a subsequent browsing session.

但是你需要实现 IShellBrowser 并调用类似 SHGetViewStatePropertyBag 的东西来获取 Explorer 使用的存储实现并将其提供给 IShellView要求它。这里的大部分细节都没有记录,我建议您使用 IExplorerBrowser 导航到该文件夹​​,而不是尝试自己托管 IShellView。使用“Shell”作为包名称。

SHGetViewStatePropertyBag 已添加到 Windows XP 中,但 IExplorerBrowser 不存在。如果您需要支持 the undocumented interface这是 IShellViewSHGetViewStatePropertyBag 之间的粘合剂。

在 Windows 2000 及更早版本上,我相信状态直接存储在 IStream 中,而不是在属性包中。 OpenRegStream 用于打开流,但计算 MRU 路径的函数未记录,但 KB 812003至少告诉你根。

关于c++ - 在新目录上设置可见列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56799532/

相关文章:

c++ - C++ 静态简单类型是否按顺序初始化?

winapi - UnhandledExceptionFilter 的 "application-defined"到底是什么?

c# - 有没有办法在不使用 WM_GETMINMAXINFO 消息的情况下更改窗口的最大宽度?

c# - 没有源码目录怎么拖放文件?

node.js - Node : How to get the dirname where a script was called from?

c++ - 在 gcc 中将目录的包含顺序设置为最后

c++释放priority_queue中的内存

c++ - VS 2015 内部编译器错误 static constexpr const char* a[] = {"foo", "bar"}

c++ - 派生类赋值运算符在base中的使用

winapi - 将声音流传输到Windows上的扬声器