如何从剪贴板中查找所有文件的名称

Posted

技术标签:

【中文标题】如何从剪贴板中查找所有文件的名称【英文标题】:How to find the names of all files from the clipboard 【发布时间】:2017-04-25 10:19:59 【问题描述】:

我刚刚创建了一个 MFC 应用程序来从剪贴板中查找文件名

AddClipboardFormatListener(AfxGetApp()->m_pMainWnd->m_hWnd);

LRESULT Cfile_trackerDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)

    switch(message)
    
    case WM_CLIPBOARDUPDATE:
        
            AfxBeginThread(FileArrival, NULL);
            break;
        
    case WM_CHANGECBCHAIN:
        
            AfxBeginThread(FileArrival, NULL);
            break;
               
    
    return CDialog::WindowProc(message, wParam, lParam);


UINT FileArrival(LPVOID param)

    TCHAR lpszFileName[MAX_PATH];
    char *szTime;
    time_t thistime;
        OpenClipboard(0);
        HGLOBAL hGlobal = (HGLOBAL)GetClipboardData(CF_HDROP);
        if (hGlobal)
        
            HDROP hDrop = (HDROP)GlobalLock(hGlobal);
            if (hDrop)
               
                time(&thistime);
                szTime = ctime(&thistime);
                DragQueryFile(hDrop, 0, lpszFileName, MAX_PATH);
                WriteLog((char*)lpszFileName,1);
                GlobalUnlock(hGlobal);
            
        CloseClipboard();
    
    return 0;

当我们复制 1 个文件时,这段代码运行良好,但是当我们复制多个文件时,它只显示第一个文件。有什么方法可以找出复制到剪贴板的所有文件名。

【问题讨论】:

【参考方案1】:

您可以使用它来查找已删除的文件数:

UINT fileCount = DragQueryFile(hDrop, 0xFFFFFFFF, nullptr, 0);

有了这些信息,你可以分配一个字符串数组,并将每个文件名存储到数组中的一个字符串中:

TCHAR** filenames;
// other code . . .
filenames = malloc(fileCount * sizeof(TCHAR*));
// other code . . .
for (UINT i = 0; i < fileCount; ++i) 
    UINT filenameLength = DragQueryFile(hDrop, i, nullptr, 0);
    filenames[i] = malloc(filenameLength);
    DragQueryFile(hDrop, i, filenames[i], filenameLength);

我通过阅读documentation 了解了这一切。

编辑:要在此处使用 C++ 标准库(避免手动分配内存 free),您可以使用以下代码:

std::vector<std::basic_string<TCHAR> > filenames(fileCount);
// other code . . .
for (UINT i = 0; i < fileCount; ++i) 
    UINT filenameLength = DragQueryFile(hDrop, i, nullptr, 0);
    filenames[i].reserve(filenameLength);
    DragQueryFile(hDrop, i, &(filenames[i][0]), filenameLength);
    // Uncomment the below line and comment the above line if you can use C++17 features
    // DragQueryFile(hDrop, i, filenames[i].data(), filenameLength);

【讨论】:

原始指针和malloc 在 C++ 中没有位置。 vector&lt;wstring&gt; 怎么了?有人已经写了内存管理。你没有理由再做一次。 @IInspectable 我添加了另一个使用 C++ 功能的解决方案。第一个解决方案是继续项目中已经使用的编码风格。

以上是关于如何从剪贴板中查找所有文件的名称的主要内容,如果未能解决你的问题,请参考以下文章

AS3 如何将数据从对象提取到剪贴板、rest、db、文件等?

将所有行复制到剪贴板

JavaScript:如何查找 IP 地址 [重复]

PS认识及新建文件

从 png 文件添加剪贴画

如何将服务器上的文件内容复制到本地剪贴板?