Установка видимых столбцов в новом каталоге - PullRequest
3 голосов
/ 28 июня 2019

Я разрабатываю расширение оболочки, которое создает новую папку. Мне бы хотелось, чтобы новая папка отображала набор настраиваемых столбцов в подробном представлении, когда пользователь просматривает ее. Я подумал, что, возможно, 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? Или их нельзя использовать для обычных папок оболочки?

1 Ответ

0 голосов
/ 28 июня 2019

SHCreateShellFolderView создает экземпляр предоставленной оболочки IShellView, и этот интерфейс знает, как сохранить его настройки, но запрашивает у хоста IShellBrowser реализацию хранилища.IShellView::CreateViewWindow подключает представление к его хосту.

IShellView::SaveViewState:

Сохраняет настройки представления оболочки, чтобы текущее состояние можно было восстановить во время следующего сеанса просмотра.

Но вам нужно реализовать IShellBrowser и вызвать что-то вроде SHGetViewStatePropertyBag, чтобы получить реализацию хранилища, используемую Explorer, и присвоить ее IShellView, когда она ее запрашивает.Большинство деталей здесь недокументированы, и я бы порекомендовал вам использовать IExplorerBrowser для перехода к папке, а не пытаться разместить IShellView самостоятельно.Используйте «Shell» в качестве имени сумки.

SHGetViewStatePropertyBag был добавлен в Windows XP, но IExplorerBrowser там не существует.Если вам нужна поддержка недокументированный интерфейс , который является связующим звеном между IShellView и SHGetViewStatePropertyBag.

В Windows 2000 и старше я считаю, что состояниехранится непосредственно в IStream, а не в пакете свойств.OpenRegStream используется для открытия потока, но функция, которая вычисляет путь MRU, недокументирована, но KB 812003 по крайней мере сообщает вам корень.

...