Я пытаюсь реализовать контекстное меню проводника для своего 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);