2012-05-19 141 views
4

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

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

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

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

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

回答

-1

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

+0

感谢您的答复,但我知道如何显示上下文菜单:)你指的是本文介绍了如何将项目添加到右键菜单。再次,我只需要显示它(默认项目是打开,打印,编辑,打开...等 – Alex

9

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

A Raymond Chen blog series "How to host an IContextMenu"

而一些非C++样品也:

等相关的问题:

0

你有两个选择:

1)实现对自己的每一个功能,创建corresponing自定义上下文菜单上的操作,或

2)访问Windows API ...这就是Qt 考虑到Qt是跨平台的目的不是

+0

2)这是某人发明#ifdef的原因之一;) – jaskmar

0

这里是我如何做到这一点:

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; 
} 
相关问题