【发布时间】:2019-11-09 23:27:01
【问题描述】:
我正在开发一个用于创建新文件夹的 shell 扩展。一旦用户浏览到新文件夹,我希望新文件夹在详细信息视图中显示一组自定义列。我认为IColumnManager 可能是完成此任务的正确接口。这是创建新文件夹后我正在尝试的代码(我已缩写 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 或其他什么?如果它不是正确的界面,当用户浏览到文件夹时,如何设置一组自定义列?谢谢。
编辑:此代码实际上适用于文件夹的活动视图。但是,它对列所做的更改不会持续存在(与用户手动进行的列更改不同,它会持续存在)。所以我想我想知道是否有办法让它们持久存在,或者是否有另一种方法来设置列而不需要活动视图。再次感谢。
另外,SHGetViewStatePropertyBag 是否相关?连同IExplorerBrowser::SetPropertyBag?或者那些不能用于常规 shell 文件夹?
【问题讨论】:
-
注意
IColumnManager::SetColumns会清除所有列的状态,所以必须在之后调用IColumnManager::SetColumnInfo来设置各个列的状态。 -
谢谢,我认为
SetColumnInfo有效,只要文件夹视图处于活动状态。所以这很好。您是否知道在不查看文件夹时是否可以设置列?再次感谢! -
列集(及其状态,SHCOLSTATE)由 IShellFolder 接口实现决定。您拥有该文件夹吗?又名:你会写一个 Shell 命名空间扩展吗?
-
不,我不这么认为。它只是我创建的一个目录,我把它变成了一个系统文件夹。
-
绑定到正常的“DOS”路径为您提供了 IShellFolder 的基本系统实现,它支持适用于文件系统项的所有列。
标签: c++ winapi directory com multiple-columns