Я попытался выполнить пакетное меню правой кнопки мыши на нескольких файлах, коды выглядят следующим образом.
В win7 и более поздних версиях оно работало нормально, но в winXP меня смущает, я могу получить только системное меню как Open, Print, в то время как расширенное меню отсутствует, как WinRAR menu, меню 7z.
Я заметил, что некоторые другие программы, такие как Everything, могут получить полное контекстное меню. Кто-нибудь знает почему? Большое спасибо!
openShellContextMenuForObject(L"C:/test.txt", 0, 0, this->m_hWnd);
bool CtestDlg::openShellContextMenuForObject(const std::wstring &path, int xPos, int yPos, void * parentWindow)
{
assert (parentWindow);
ITEMIDLIST * id = 0;
std::wstring windowsPath = path;
std::replace(windowsPath.begin(), windowsPath.end(), '/', '\\');
HRESULT result = SHParseDisplayName(windowsPath.c_str(), 0, &id, 0, 0);
if (!SUCCEEDED(result) || !id)
{
return false;
}
IShellFolder * ifolder = 0;
LPCITEMIDLIST idChild = 0;
result = SHBindToParent(id, IID_IShellFolder, (void**)&ifolder, &idChild);
if (!SUCCEEDED(result) || !ifolder)
{
return false;
}
IContextMenu * imenu = 0;
result = ifolder->GetUIObjectOf((HWND)parentWindow, 1, (const ITEMIDLIST **)&idChild, IID_IContextMenu, 0, (void**)&imenu);
if (!SUCCEEDED(result) || !ifolder)
{
return false;
}
HMENU hMenu = CreatePopupMenu();
if (!hMenu)
{
return false;
}
if (SUCCEEDED(imenu->QueryContextMenu(hMenu, 0, 0, 1000, CMF_NORMAL)))
{
int iMenuCount = GetMenuItemCount(hMenu);
MENUITEMINFO itemInfo = {0};
itemInfo.cbSize = sizeof(MENUITEMINFO);
int iCmd = TrackPopupMenuEx(hMenu, TPM_RETURNCMD, 00, 0, (HWND)parentWindow, NULL);
if (iCmd > 0)
{
CMINVOKECOMMANDINFOEX info = { 0 };
info.cbSize = sizeof(info);
info.fMask = CMIC_MASK_UNICODE;
info.hwnd = (HWND)parentWindow;
info.lpVerb = MAKEINTRESOURCEA(iCmd - 1);
info.lpVerbW = MAKEINTRESOURCEW(iCmd - 1);
info.nShow = SW_SHOWNORMAL;
imenu->InvokeCommand((LPCMINVOKECOMMANDINFO)&info);
}
}
DestroyMenu(hMenu);
return true;
}