如何显示 Windows 资源管理器上下文(右键单击)菜单

How to show Windows Explorer context (right click) menu?

本文关键字:上下文 右键 单击 菜单 资源管理器 Windows 显示 何显示      更新时间:2023-10-16

我想显示Windows资源管理器上下文菜单。

不想将我的应用程序添加到其中,我只想在我的应用程序中显示它。

我需要的实现的一个很好的例子是总指挥官。

如果按住鼠标右键,TC 将显示上下文菜单,这与 Windows 资源管理器中的菜单完全相同。

我使用的是C++/Qt,但语言在这里并不重要。

我找到了几个可能对你有帮助的样本。 单独使用 Qt 不太可能做到这一点,因为 shell 上下文菜单是高度特定于操作系统的;可能还需要一些 Win32 调用。

  • 在应用程序中使用 Shell 上下文菜单
  • 资源管理器外壳上下文菜单

Raymond Chen 博客系列"如何托管 IContextMenu">

还有一些非C++样本:

  • C# 文件浏览器
  • C# 中的命令行管理程序上下文菜单示例

以及相关的SO问题:

  • 如何访问 Windows 外壳上下文菜单项?
  • 如何获取右键单击文件夹背景的完整shell上下文菜单

您有两个选择:

1( 自行实现每个功能,在自定义上下文菜单上创建相应的操作,或者

2( 访问 Windows API...而这正是Qt不打算考虑Qt是跨平台的。

这是我的做法:

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;
}

http://www.ffuts.org/blog/right-click-context-menus-with-qt/

右键单击以弹出上下文菜单非常简单 在Qt。只有几件事需要注意...

 // myWidget is any QWidget-derived class
 myWidget->setContextMenuPolicy(Qt::CustomContextMenu);
 connect(myWidget, SIGNAL(customContextMenuRequested(const QPoint&)),
     this, SLOT(ShowContextMenu(const QPoint&)));

另一方面,如果您正在寻找"Windows资源管理器集成"或"Windows Shell集成"之类的内容,这里有一个很好的(尽管不是特定于QT(的示例:

http://www.codeproject.com/Articles/15171/Simple-shell-context-menu

关键是实现这两个 Windows shell 接口:

  • 图标文本菜单

  • 地狱灭绝