MarshalS Ответов: 1

Как найти имена всех файлов из буфера обмена


Я только что создал приложение MFC, чтобы найти имена файлов из буфера обмена.Этот код отлично работает, когда мы копируем 1 файл, но когда мы копируем несколько файлов, он показывает только первый файл. Есть ли какой-нибудь способ узнать все имена файлов, скопированные в буфер обмена?

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

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 Ответов

Рейтинг:
9

Jochen Arndt

См. документацию: Функция DragQueryFile (Windows)[^].

Вызов DragQueryFile сначала с iFile значение 0xFFFFFFFF. Этот вызов вернет количество имен файлов. Затем используйте цикл для получения каждого имени файла:

UINT fileCount = DragQueryFile(hDrop, 0xffffffff, NULL, 0);
for (UINT i = 0; i < fileCount; i++)
{
    DragQueryFile(hDrop, i, lpszFileName, MAX_PATH);
    /* Do something with lpszFileName here */
}