| 79 | } |
| 80 | |
| 81 | void FileContextMenu::ShowAt(winrt::Microsoft::UI::Xaml::Controls::MenuFlyout& flyout) |
| 82 | { |
| 83 | if (flyout.Items().Size() != 0) |
| 84 | return; |
| 85 | |
| 86 | winrt::com_ptr<IShellItem> item = CreateItemFromParsingName(m_path.data()), folderItem; |
| 87 | item->GetParent(folderItem.put()); |
| 88 | |
| 89 | winrt::com_ptr<IShellFolder> folder; |
| 90 | folderItem->BindToHandler(nullptr, BHID_SFObject, IID_PPV_ARGS(folder.put())); |
| 91 | |
| 92 | |
| 93 | LPITEMIDLIST child{ }; |
| 94 | |
| 95 | SHGetIDListFromObject(item.get(), &child); |
| 96 | auto last = ILFindLastID(child); |
| 97 | |
| 98 | LPCITEMIDLIST idl[2]{ last }; |
| 99 | |
| 100 | auto hr = folder->GetUIObjectOf(NULL, 1, &idl[0], IID_IContextMenu, nullptr, m_menu.put_void()); |
| 101 | |
| 102 | auto hMenu = CreatePopupMenu(); |
| 103 | m_menu->QueryContextMenu(hMenu, 0, 1, 0x7fff, CMF_NORMAL); |
| 104 | |
| 105 | auto const itemCount = GetMenuItemCount(hMenu); |
| 106 | MENUITEMINFO menuItemInfo{ |
| 107 | .cbSize = sizeof(menuItemInfo), |
| 108 | .fMask = MIIM_BITMAP | MIIM_FTYPE | MIIM_STRING | MIIM_ID | MIIM_SUBMENU |
| 109 | }; |
| 110 | for (int i = 0; i < itemCount; ++i) |
| 111 | { |
| 112 | TCHAR buffer[500]{}; |
| 113 | menuItemInfo.dwTypeData = buffer; |
| 114 | menuItemInfo.cch = std::size(buffer); |
| 115 | GetMenuItemInfo(hMenu, i, true, &menuItemInfo); |
| 116 | if (!std::wstring_view{buffer}.empty() && m_menu) |
| 117 | { |
| 118 | flyout.Items().Append(makeMenuFlyout(menuItemInfo)); |
| 119 | std::wstring command(100, {}); |
| 120 | m_menu->GetCommandString(menuItemInfo.wID - 1, GCS_VERB, nullptr, reinterpret_cast<char*>(command.data()), command.size()); |
| 121 | m_menuData.push_back(MenuData{ .menuId = menuItemInfo.wID - 1, .verb = std::move(command) }); |
| 122 | } |
| 123 | } |
| 124 | } |
no test coverage detected