如何从Win32应用程序拖动文件和文件夹拖放在资源管理器

问题描述:

我在C++ Win32应用程序工作,我实现DragAndDrop操作,我可以能够从资源管理器中的文件和文件夹拖放到使用WndProc电话与WM_DROPFILES我的应用程序,现在我尝试从Win32应用程序到资源管理器的DragAndDrop文件和文件夹。如何从Win32应用程序拖动文件和文件夹拖放在资源管理器

我写了一个示例代码,将文本从应用程序拖动到资源管理器,使用Karlsson’s Drag-and-Drop C图书馆工作正常,但我的要求是将文件和文件夹从win32应用程序拖放到资源管理器。下面是我的示例代码放置文本。

case WM_LBUTTONDOWN: 
{ 
    char* text = "Hello, World! This is the drop source."; 
    HANDLE text_on_heap; 
    PMYDROPSOURCE text_drop_source; 
    CLIPFORMAT cf[1] = { CF_TEXT }; 
    text_on_heap = GlobalAlloc(GMEM_FIXED, strlen(text) + 1); 
    if (NULL == text_on_heap) break; 
    strcpy((char*)text_on_heap, text); 
    text_drop_source = CreateMyDropSource(FALSE, cf, &text_on_heap, 1); 
    if (NULL != text_drop_source) 
    { 
    /* Drop source created, so begin the drag. This will block. */ 
     MyDragDropSource(text_drop_source); 
    /* Drag-drop is done so destroy the drop source. */ 
     FreeMyDropSource(text_drop_source); 
    } 
    /* Free up the buffer; drag-drop is finished. */ 
    GlobalFree(text_on_heap); 
    return TRUE; 
} 
+0

您的代码在这里不会尝试使用文件操作 –

+0

@DavidHeffernan是的。它的拖放文本的示例代码,所以我正在寻找拖放文件和文件夹。同样的方式,我尝试了CF_HDROP,但它不工作。 – Krish

+2

为什么不做一些研究。如果有的话有很多例子。 –

要让Explorer接受拖动的文件,我们所要做的就是创建一些CF_HDROP数据并将其放入数据对象中。所以你必须使用IDropSource和IDropTarget。

所以你需要DROPFILES结构。创建有点棘手(因为它不总是相同的大小)。

比你必须创建一个IDataSource并执行DoDragDrop。

您发现MSDN

概述这里是一个完整的示例,演示与MFC操作。看看最后一节。

一个普通的Win32版本的代码是here。它在sourceforge上使用一个小型图书馆

+0

感谢您的解决方案。是的,它绝对正确,我会为此而努力。 – Krish

+1

请注意'CF_HDROP'只适用于filesytem上的物理文件。要拖放虚拟文件,请改用“CFSTR_FILEDESCRIPTOR”和“CFSTR_FILECONTENTS”。 –

+0

@RemyLebeau感谢您的信息。 – Krish