0

我需要帮助来创建一个 IDataObject 以启用这 2 个项目(运行和帮助)的拖放。例如,我需要像 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} 
4

1 回答 1

0

我假设您在任何时间点都只想要数据对象中的这些项目之一,在这种情况下:

如果您想在同一操作中拖放两个项目,那么事情就会变得困难。我不知道这两个对象是否具有相同的父对象。如果他们这样做了,那么即使是旧的 CIDLData_CreateFromIDArray 也可以处理它。如果他们不这样做,那么您可以尝试 SHCreateShellItemArrayFromIDLists 然后使用IShellItemArray::BindToHandler(...,BHID_DataObject,...). 要支持 < Vista 我相信您必须创建自己的CFSTR_SHELLIDLIST并将其添加到数据对象中。

拖动图像与此无关,应该在一个单独的问题中询问,其中包含有关 IDragSourceHelper 等的信息。

于 2012-05-16T22:04:41.860 回答