我需要帮助来创建 IDataObject 以启用这两个项目的拖放(运行和帮助)例如,我需要像Windows开始菜单一样做。
为了运行它们,我使用这些
CComPtr<IShellDispatch2> pShellDisp;
if (SUCCEEDED(CoCreateInstance(CLSID_Shell,NULL,CLSCTX_SERVER,IID_IShellDispatch2,(void**)&pShellDisp)))
{
pShellDisp->Help(); //Help
pShellDisp->FileRun(); //Run
}
你们能帮我吗?
PS:我也需要带有图像图标的拖动
编辑 [已解决]
IShellFolder* desk = NULL;
HRESULT hr =SHGetDesktopFolder(&desk);
LPITEMIDLIST pidl2=NULL;
ULONG cbEaten;
DWORD dwAttribs = 0 ;
hr = desk->ParseDisplayName(NULL,
NULL,
L"shell:::{2559a1f3-21d7-11d4-bdaf-00c04f60b9f0}",
&cbEaten, // This can be NULL
&pidl2,
&dwAttribs);
hr = desk->GetUIObjectOf(parentHwnd, 1,
(PCITEMID_CHILD*)&pidl2, IID_IDataObject, 0, (LPVOID *)lpdataObj);
desk->Release();
return;
对于运行:
shell:::{2559a1f3-21d7-11d4-bdaf-00c04f60b9f0}
我假设您只需要在任何时间点在数据对象中出现这些项目之一,在这种情况下:
- 如果您已经有一个 IShellItem,那么您可以调用
IShellItem::BindToHandler(...,BHID_DataObject,...)
。 - 如果你只有pidl,你可以使用SHCreateDataObject或CIDLData_CreateFromIDArray
如果您想在同一操作中拖放两个项目,那么事情就会变得困难。我不知道这两个对象是否具有相同的父对象。如果他们这样做,那么即使是旧的CIDLData_CreateFromIDArray也可以处理它。如果他们不这样做,那么你可以尝试SHCreateShellItemArrayFromIDLists,然后使用IShellItemArray::BindToHandler(...,BHID_DataObject,...)
。为了支持<Vista,我相信您必须创建自己的CFSTR_SHELLIDLIST并将其添加到数据对象中。>
拖动图像与此无关,应该在一个单独的问题中提出,其中包含有关IDragSourceHelper等的信息。