Member 14075717 Ответов: 1

Как перетащить файлы и папки из приложения win32 и перейти в проводник


Я работаю в приложении C++ Win32 и реализую операцию DragAndDrop, я могу перетаскивать файлы и папки из проводника в свое приложение с помощью вызовов WndProc с WM_DROPFILES, теперь я пытаюсь перетащить файлы и папки DragAndDrop из приложения Win32 в проводник.
может ли кто-нибудь помочь мне реализовать его на c++?

Что я уже пробовал:

Я использую интерфейсы ввода объекта данных ,я Источник данных,ввода данных droptarget.

Richard MacCutchan

В чем именно заключается проблема?

Member 14075717

Я должен реализовать функцию перетаскивания для приложения win32 api на языке c++. Для drop у меня есть сообщение(WM_DROPFILES)(https://docs.microsoft.com/en-us/windows/desktop/shell/wm-dropfiles) но для перетаскивания файлов у меня нет никакого мессажа, поэтому я пытаюсь использовать API DODRAGDROP, но у меня есть проблема с его реализацией .Поэтому, пожалуйста, помогите мне реализовать его с помощью DODRAGDROP или любого другого способа сделать это на C++ .

Заранее спасибо

1 Ответов

Рейтинг:
1

Member 14075717

Привет, могу ли я использовать те же API для приложения WIN32, которые они используются в приведенном выше примере кода, который реализован для приложения MFC?

Richard MacCutchan

В статье объясняется, что необходимо для создания списка выпадающих файлов, который можно отправить в Проводник. Хотя приложение написано в MFC, фактическое создание droplist и добавление в буфер обмена использует стандартные функции Win32. Единственное, что вам нужно изменить, - это использовать обычный символьный массив или std::string для списка имен файлов.

Member 11393783

Привет ,


Мы попробовали реализовать IdataObject и IdropSource, а также Как заполнить детали файла в FORMATETC и т. д.. Пожалуйста, помогите с этим.

Написал какой-то код на языке Си. Как вызвать shellapi в CPP-коде.

pITEMDLIST_File = ILCreateFromPath(fName);
					if (!pITEMDLIST_File)
						return 0;

					iResu = SHBindToParent(pITEMDLIST_File, &IID_IShellFolder, (void**)&pFolder, (PCUITEMID_CHILD*)&pFile_list_relative);
					if (iResu != S_OK)
						return 0;

					pArray[0] = pFile_list_relative;
					iResu = IShellFolder_GetUIObjectOf(pFolder, NULL, 1, pArray, riid, NULL, (void**)&pInterfaceResu);
					if (iResu != S_OK)
						return 0;

					IShellFolder_Release(pFolder);

					//return pInterfaceResu;
					pObj = (IDataObject*)pInterfaceResu;
				}

				if (!pObj)
					break;

				pSrc = _CreateDropSource();
				if (!pSrc)
				{
					//IDataObject_Release(pObj);
					break;
				}

				DoDragDrop(pObj, NULL, DROPEFFECT_COPY DROPEFFECT_LINK, &dwEffect);

Thanks,
Venkat