加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:06:09 所属栏目:百科 来源:网络整理
导读:我刚刚创建了一个MFC应用程序来从剪贴板中查找文件名 AddClipboardFormatListener(AfxGetApp()-m_pMainWnd-m_hWnd);LRESULT Cfile_trackerDlg::WindowProc(UINT message,WPARAM wParam,LPARAM lParam){ switch(message) { case WM_CLIPBOARDUPDATE: { AfxBeg
我刚刚创建了一个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,lpszFileName,MAX_PATH);
                WriteLog((char*)lpszFileName,1);
                GlobalUnlock(hGlobal);
            }
        CloseClipboard();
    }
    return 0;
}

当我们复制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,0);
    filenames[i] = malloc(filenameLength);
    DragQueryFile(hDrop,filenames[i],filenameLength);
}

我从阅读documentation中得到了这一切.

编辑:要在此处使用C标准库(防止必须手动释放已分配的内存),您可以使用以下代码:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读