我正在开发一个可以创建新文件夹的 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
不存在。如果您需要支持 IShellView
和 SHGetViewStatePropertyBag
之间的粘合剂。
在 Windows 2000 及更早版本上,我相信状态直接存储在 IStream
中,而不是在属性包中。 OpenRegStream
用于打开流,但计算 MRU 路径的函数未记录,但 KB 812003至少告诉你根。
关于c++ - 在新目录上设置可见列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56799532/