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

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

我不想添加我的应用程序,我只是想显示它。

Total Commander是我需要的一个很好的例子。

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

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

我发现了几个样本可以帮助你。 你不可能单独使用Qt来完成这项工作,因为shell的上下文菜单是特定于操作系统的; 可能还需要一些Win32调用。

  • 在您的应用程序中使用Shell ContextMenu
  • Explorer Shell上下文菜单

Raymond Chen博客系列“如何主持IContextMenu”

还有一些非C ++的例子:

  • C#文件浏览器
  • 在C#中的Shell上下文菜单示例

和相关的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外壳接口:

  • IContextMenu

  • IShellExtInt