gpt4 book ai didi

c++ - 在 (c++/c#) 中单击鼠标右键时如何获取快捷方式显示名称

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:23:55 24 4
gpt4 key购买 nike

我正在构建一个关于filecontextmenu的dll,我需要在鼠标右键单击时获取执行路径和快捷方式displaynem。现在我可以获取路径,但不知道如何获取显示名称。例如:桌面上的 IE 快捷方式,我需要用户可以编辑的名称“IE”,而不是“iexplore.exe”。

这是一个reference非常相似,但我找不到我应该做的,当桌面上的快捷方式

如果有任何建议,我将不胜感激,这是我的代码,谢谢。

IFACEMETHODIMP FileContextMenuExt::Initialize(
LPCITEMIDLIST pidlFolder, LPDATAOBJECT pDataObj, HKEY hKeyProgID)

if (NULL == pDataObj)
return E_INVALIDARG;

HRESULT hr = E_FAIL;

FORMATETC fe = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
STGMEDIUM stm;

// The pDataObj pointer contains the objects being acted upon. In this
// example, we get an HDROP handle for enumerating the selected files and
// folders.
if (SUCCEEDED(pDataObj->GetData(&fe, &stm)))
{
// Get an HDROP handle.
HDROP hDrop = static_cast<HDROP>(GlobalLock(stm.hGlobal));

if (hDrop != NULL)
{
UINT nFiles = DragQueryFileW(hDrop, 0xFFFFFFFF, NULL, 0);
if (nFiles > 0)
{
vecSelectFiles.clear();
std::vector<std::wstring> vecTotalFiles;
vecTotalFiles.clear();
for(int i=0; i<(int)nFiles; ++i)
{
wchar_t wszThisFile[MAX_PATH];
memset(wszThisFile, 0, MAX_PATH*2);
// Here get excution path
if(DragQueryFileW(hDrop, i, wszThisFile, MAX_PATH) != 0)
{
vecTotalFiles.push_back(wszThisFile);
hr = S_OK;
}
}
}
GlobalUnlock(stm.hGlobal);
}
ReleaseStgMedium(&stm);
}

// If any value other than S_OK is returned from the method, the context
// menu item is not displayed.
return hr;

最佳答案

如 MSDN 中所述,“建议处理程序使用 Shell 项数组而不是 CF_HDROP 和 CFSTR_SHELLIDLIST(也称为 HIDA)等剪贴板格式,因为它会导致更简单的代码并允许一些性能改进。”

因此,首先在 pDataObj 上调用 SHCreateShellItemArrayFromDataObject() 并检索 IShellItemArray 接口(interface)。用 IShellItemArray::Count() 和 IShellItemArray::GetItemAt() 枚举它。

每个 IShellItem 对象都有一个出色的 GetDisplayName() 方法!您可以指定显示类型:

SIGDN_NORMALDISPLAY = 0x00000000,
SIGDN_PARENTRELATIVEPARSING = 0x80018001,
SIGDN_PARENTRELATIVEFORADDRESSBAR = 0x8001c001,
SIGDN_DESKTOPABSOLUTEPARSING = 0x80028000,
SIGDN_PARENTRELATIVEEDITING = 0x80031001,
SIGDN_DESKTOPABSOLUTEEDITING = 0x8004c000,
SIGDN_FILESYSPATH = 0x80058000,
SIGDN_URL = 0x80068000,

你有 SIGDN_FILESSPATH 和 SIGDN_NORMALDISPLAY ids :-)

关于c++ - 在 (c++/c#) 中单击鼠标右键时如何获取快捷方式显示名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13188027/

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