C++ 获取鼠标选中的文件路径
在 Windows 操作系统下,可以利用 Shell API 来获取鼠标选中的文件路径。
具体步骤如下:
-
使用 Windows API 函数 RegisterClipboardFormat 注册一个剪贴板格式 'CFSTR_SHELLIDLIST',该格式用于表示 Shell IDList。
-
在窗口消息处理函数中,处理 'WM_DROPFILES' 和 'WM_DROPFILES_DROPPED' 消息,获取鼠标拖拽文件信息。
-
如果消息处理函数收到 'WM_DROPFILES' 消息,则需要调用 DragQueryFile 函数获取拖拽的文件路径。
-
如果消息处理函数收到 'WM_DROPFILES_DROPPED' 消息,则需要调用 Shell API 函数 SHGetPathFromIDList 获取 Shell IDList 对应的文件路径。
下面是一个简单的示例代码:
#include <windows.h>
#include <shlobj.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DROPFILES:
{
// 获取拖拽的文件数目
UINT uFileCount = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL, 0);
if (uFileCount > 0)
{
// 获取拖拽的第一个文件路径
TCHAR szFilePath[MAX_PATH] = { 0 };
DragQueryFile((HDROP)wParam, 0, szFilePath, MAX_PATH);
// 处理文件路径...
}
DragFinish((HDROP)wParam);
break;
}
case WM_DROPFILES_DROPPED:
{
// 获取 Shell IDList
LPIDA pData = (LPIDA)GlobalLock((HGLOBAL)wParam);
if (pData != NULL)
{
// 获取 Shell IDList 对应的文件路径
TCHAR szFilePath[MAX_PATH] = { 0 };
SHGetPathFromIDList(pData->aoffset[1], szFilePath);
// 处理文件路径...
}
GlobalUnlock((HGLOBAL)wParam);
break;
}
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
需要注意的是,如果是在 MFC 框架下实现,则可以使用 CShellFileDataObject 类来获取鼠标选中的文件路径。
原文地址: https://www.cveoy.top/t/topic/oWbg 著作权归作者所有。请勿转载和采集!