Получение текущего пользователя IShellView взаимодействует с - PullRequest
0 голосов
/ 27 января 2019

Я пишу расширение оболочки с обработчиком контекстного меню.Если щелкнуть правой кнопкой мыши файл и выбрать пункт контекстного меню, будет создан другой файл в той же папке.

Я хочу, чтобы новый файл автоматически выбирался в проводнике Windows после операции, как если бы пользователь имелвставил файл.Для того, что я понимаю, мне нужно использовать IShellView :: SelectItem .Но как мне получить текущий IShellView объект оболочки (File Explorer), с которым взаимодействует пользователь?

1 Ответ

0 голосов
/ 29 января 2019

вам нужно реализовать IObjectWithSite интерфейс o вашего объекта контекстного меню:

class CMenuExtension : IShellExtInit, IContextMenu, IObjectWithSite {.. };

в результате SetSite будет вызываться после CMenuExtension::Initialize и до CMenuExtension::QueryContextMenu.здесь вы можете использовать переданный pUnkSite для получения интерфейса IFolderView и / или IShellView.что-то вроде этого

virtual HRESULT STDMETHODCALLTYPE SetSite( 
    /* [in] */ __RPC__in_opt IUnknown *pUnkSite)
{
    if (_pUnkSite)
    {
        _pUnkSite->Release();

        if (_pfv)
        {
            _pfv->Release();
            _pfv = 0;
        }
    }

    _pUnkSite = pUnkSite;

    if (pUnkSite)
    {
        pUnkSite->AddRef();

        IServiceProvider* psp;

        if (0 <= pUnkSite->QueryInterface(IID_PPV_ARGS(&psp)))
        {
            IFolderView* pfv;

            if (0 <= psp->QueryService(__uuidof(IFolderView), IID_PPV_ARGS(&pfv)))
            {
                _pfv = pfv;

                IShellFolder* psf;

                if (0 <= pfv->GetFolder(IID_PPV_ARGS(&psf)))
                {
                    STRRET sr;
                    if (0 <= psf->GetDisplayNameOf(0, SHGDN_FORPARSING , &sr))
                    {
                       ...
                    }
                    psf->Release();
                }
            }

            psp->Release();
        }
    }

    return S_OK;
}

, поэтому вам нужно сначала спросить интерфейс сайта для IServiceProvider интерфейса, а затем позвонить

QueryService(__uuidof(IFolderView), IID_PPV_ARGS(&pfv)

для __uuidof(IFolderView) для IFolderView и / или IShellViewинтерфейс.

, скажем, IFolderView tou также может получить интерфейс IShellFolder.запомните эти интерфейсы в объекте, а затем используйте от InvokeCommand

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...