如何从剪贴板中查找所有文件的名称
How to find the names of all files from the clipboard
我刚刚创建了一个 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;
}
当我们复制一个文件时这段代码工作正常,但是当我们复制多个文件时它只显示第一个文件。有什么方法可以找出所有复制到剪贴板的文件名吗
您使用它来查找丢失的文件数:
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);
}
我刚刚创建了一个 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;
}
当我们复制一个文件时这段代码工作正常,但是当我们复制多个文件时它只显示第一个文件。有什么方法可以找出所有复制到剪贴板的文件名吗
您使用它来查找丢失的文件数:
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);
}