如何显示 Windows 资源管理器上下文(右键单击)菜单
How to show Windows Explorer context (right click) menu?
我想显示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 接口:
图标文本菜单
地狱灭绝
相关文章:
- 如何将我的程序添加到文件和文件夹的macOS右键单击菜单?
- Qt - 右键单击时编辑按钮文本
- 如何处理鼠标右键单击qsystemtrayicon
- 当右键单击时,来自Menubar的Popupmenu
- 如何在列表控件中创建右键单击菜单
- QT:检测 QGraphicsItem 上的鼠标左键和右键按下事件
- Qt:鼠标右键单击QDockWidget标题
- 电子内部或外部方法创建自己的右键单击上下文菜单 - Windows
- 将项目插入桌面右键单击菜单从外壳扩展
- 如何使用C++禁用窗口上的右键单击按钮
- 如何处理列表控制标头中的右键单击事件
- 当鼠标右键单击(C /C#)时,如何获得快捷方式显示名称
- 右键单击按钮GTKMM-3.0的信号
- 右键单击系统托盘图标,然后单击C 中的上下文菜单
- 将菜单项添加到Windows Explorer右键单击Java中的上下文菜单
- Windows 资源管理器右键单击文件和文件夹的上下文菜单
- 如何显示 Windows 资源管理器上下文(右键单击)菜单
- 如何在右键单击链接并从上下文菜单访问功能后获取链接的 DOM
- 鼠标按钮模拟-右键和上下文菜单问题
- 如何在列表框上右键创建上下文菜单