2012-05-19 4 views
4

Я хочу показать контекстное меню проводника Windows.Как показать контекстное меню Windows Explorer (контекстное меню)?

Я не хочу добавлять к нему свое приложение, я просто хочу его отобразить.

Хорошим примером реализации, который мне нужен, является 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», вот хороший (хотя и не-QT специфического) пример:

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

ключ, реализующие эти два интерфейса оболочки для Windows:

  • IContextMenu

  • IShellExtInt

+0

Спасибо за ответ, но я знаю, как показать контекстное меню :) В статье вы имеете в виду, объясняет, как добавить пункт в контекстное меню Проводника. Опять же, мне просто нужно показать это (элементы по умолчанию - Open, Print, Edit, Open with ... и т. Д. – Alex

9

Я нашел несколько образцов, которые могут помочь вам. Вероятно, вы вряд ли сможете это сделать с помощью Qt, поскольку контекстное меню оболочки сильно зависит от ОС; вероятно, потребуются также вызовы Win32.

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

И некоторые не-C++ образцы также:

и связанные SO вопросы:

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; 
} 
Смежные вопросы