Win32 iContextMenu: как создать контекстное меню для элементов с множественным выбором? - PullRequest
1 голос
/ 30 мая 2020

Я пытаюсь реализовать контекстное меню проводника для своего Windows приложения. Я смог показать соответствующее контекстное меню для одного файла, следуя этой серии статей: https://devblogs.microsoft.com/oldnewthing/20040920-00/?p=37823 Однако я не думаю, что тот же подход можно использовать, когда выбрано несколько файлов, потому что реализация передает pidl одного файла. Я тестировал, как это работает в Windows explorer. Выбор нескольких файлов и щелчок правой кнопкой мыши работали правильно; Он копировал выбранные файлы или передавал выбранные файлы для отправки по ярлыкам. Я не совсем понимаю, как это делается. Можно ли сделать то же самое с интерфейсом iContextMenu или проводник использует некоторые частные API для достижения такого поведения? Вот фрагмент кода, который я сейчас использую. Предполагается, что в пути хранится содержащаяся папка, а в файле - базовое имя целевого файла.

    IShellFolder *desktop, *fld;
    HRESULT ret = SHGetDesktopFolder(&desktop);
    if (ret != S_OK)
    {
        return 0;
    }
    DWORD chEaten;
    DWORD dwAttributes;
    LPITEMIDLIST pidl;
    ret = desktop->ParseDisplayName(NULL, NULL, const_cast<wchar_t *>(path.c_str()), &chEaten, &pidl, &dwAttributes);
    if (ret != S_OK)
    {
        desktop->Release();
        return 0;
    }
    if (desktop->BindToObject(pidl, NULL, IID_IShellFolder, (void **)&fld) != S_OK)
    {
        desktop->Release();
        return 0;
    }
    ret = fld->ParseDisplayName(NULL, NULL, const_cast<wchar_t *>(file.c_str()), &chEaten, &pidl, &dwAttributes);
    if (ret != S_OK)
    {
        desktop->Release();
        fld->Release();
        return 0;
    }
    const _ITEMIDLIST *child = ILFindLastID(pidl);
    ret = fld->GetUIObjectOf(NULL, 1, &child, IID_IContextMenu, NULL, (void **)&contextMenu);
    if (ret != S_OK)
    {
        CoTaskMemFree(pidl);
        desktop->Release();
        fld->Release();
        return 0;
    }
    contextMenu->QueryContextMenu(contextMenuHandle, 0, 101, 0x7fff, CMF_NORMAL);
    contextMenu->QueryInterface(IID_IContextMenu2, (void **)&g_pcm2);
    contextMenu->QueryInterface(IID_IContextMenu3, (void **)&g_pcm3);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...