gpt4 book ai didi

c++ - 以编程方式为多个文件调用 Windows shell 菜单(与在资源管理器中右键单击相同)

转载 作者:行者123 更新时间:2023-11-28 03:12:06 31 4
gpt4 key购买 nike

我正在尝试以编程方式显示文件的 shell 上下文菜单(与我在资源管理器中右键单击该文件时相同)。我已经设法为单个文件/文件夹做到这一点,我的代码如下。现在,如何为文件列表调用上下文菜单,就好像我在资源管理器中选择了几个文件并单击了它们一样?

bool 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;
}

最佳答案

result = ifolder->GetUIObjectOf((HWND)parentWindow, 1, (const ITEMIDLIST **)&idChild, IID_IContextMenu, 0, (void**)&imenu);

GetUIObjectOf 函数接受 PIDL 的数组。该函数调用中的 1 表示您的数组仅包含 1 个项目,但您可以使用相同的方法传递任意数量的子 PIDL。例如:

LPITEMIDLIST pidlArray[3] = { pidl1, pidl2, pidl3 };
result = ifolder->GetUIObjectOf((HWND)parentWindow, _countof(pidlArray), pidlArray, IID_IContextMenu, 0, (void**)&imenu);

(在现实世界中,您将动态构建数组)。请注意,所有项目都必须是同一父文件夹的子文件夹。

关于c++ - 以编程方式为多个文件调用 Windows shell 菜单(与在资源管理器中右键单击相同),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18159672/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com