Как показать расширение контекстного меню в WinXP на C ++ - PullRequest
0 голосов
/ 08 апреля 2020

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

В 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...