Is it possible to call system shell context menu for a file / folder from Qt app?



  • I have a path to a file system object (file / folder), and I want to all a system context (right-click) menu for it. For example, on Windows I need Windows Explorer menu.
    Is it possible?



  • It appears there's no wrapper for this in Qt, so on Windows one has to use WinAPI. Here's how it works:

    @
    bool CShellMenu::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;
    CItemIdListReleaser idReleaser (id);

    IShellFolder * ifolder = 0;

    LPCITEMIDLIST idChild = 0;
    result = SHBindToParent(id, IID_IShellFolder, (void**)&ifolder, &idChild);
    if (!SUCCEEDED(result) || !ifolder)
    return false;
    CComInterfaceReleaser ifolderReleaser (ifolder);

    IContextMenu * imenu = 0;
    result = ifolder->GetUIObjectOf((HWND)parentWindow, 1, (const ITEMIDLIST )&idChild, IID_IContextMenu, 0, (void)&imenu);
    if (!SUCCEEDED(result) || !ifolder)
    return false;
    CComInterfaceReleaser menuReleaser(imenu);

    HMENU hMenu = CreatePopupMenu();
    if (!hMenu)
    return false;
    if (SUCCEEDED(imenu->QueryContextMenu(hMenu, 0, 1, 0x7FFF, CMF_NORMAL)))
    {
    int iCmd = TrackPopupMenuEx(hMenu, TPM_RETURNCMD, xPos, yPos, (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;
    }@

    If I manage to do the same on Mac, I'll try to tidy up a wrapper class and opensource it.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.