在 Windows 操作系统下,可以利用 Shell API 来获取鼠标选中的文件路径。

具体步骤如下:

  1. 使用 Windows API 函数 RegisterClipboardFormat 注册一个剪贴板格式 'CFSTR_SHELLIDLIST',该格式用于表示 Shell IDList。

  2. 在窗口消息处理函数中,处理 'WM_DROPFILES' 和 'WM_DROPFILES_DROPPED' 消息,获取鼠标拖拽文件信息。

  3. 如果消息处理函数收到 'WM_DROPFILES' 消息,则需要调用 DragQueryFile 函数获取拖拽的文件路径。

  4. 如果消息处理函数收到 '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 类来获取鼠标选中的文件路径。

C++ 获取鼠标选中的文件路径

原文地址: https://www.cveoy.top/t/topic/oWbg 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录