2017-04-25 27 views
4

我剛剛創建了一個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個文件,該代碼工作正常查找文件名剪貼板,但當我們複製多個文件只顯示第一個文件。是否有任何方法可以找出所有複製到剪貼板的文件名。

回答

7

你用它來尋找被丟棄的文件數:

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); 
} 
+0

非常感謝它在這裏工作精細 –

+0

原始指針和'malloc'在C++中沒有地方。 'vector '有什麼問題?有人已經寫了內存管理。你沒有理由再這樣做。 – IInspectable

+1

@IInspectable我添加了另一個使用C++特性的解決方案。第一種解決方案是繼續使用已經在項目中使用的編碼風格。 – InternetAussie

相關問題