使用 C++ 获取当前活动资源管理器窗口的目录路径

本文将介绍如何使用 C++ 和 Windows API 获取当前活动资源管理器窗口的目录路径。

思路

  1. 使用 IShellWindows 接口枚举所有打开的资源管理器窗口。
  2. 通过相关接口获取每个窗口的句柄和当前文件夹的 PIDL(程序标识列表)。
  3. 如果窗口句柄与 GetForegroundWindow() 返回的句柄相同,则将 PIDL 转换为路径。

代码实现

#include <windows.h>
#include <shlobj.h>
#include <atlbase.h>

char* GetExplorerPath() {
    CComPtr<IShellWindows> pShellWindows;
    HRESULT hr = CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL, IID_PPV_ARGS(&pShellWindows));
    if (FAILED(hr)) {
        return NULL;
    }

    HWND hWnd = GetForegroundWindow();
    if (!hWnd) {
        return NULL;
    }

    VARIANT vEmpty = {};
    CComVariant vLoc;
    CComPtr<IDispatch> pDisp;
    CComPtr<IShellBrowser> pBrowser;
    CComPtr<IServiceProvider> pProvider;
    CComPtr<IShellView> pView;
    CComPtr<IFolderView> pFolderView;
    LPITEMIDLIST pidl = NULL;
    WCHAR szPath[MAX_PATH];

    pShellWindows->FindWindowSW(&vEmpty, &vEmpty, SWC_DESKTOP, (long*)&hWnd, SWFO_NEEDDISPATCH, &pDisp);
    if (!pDisp) {
        return NULL;
    }

    hr = pDisp->QueryInterface(IID_PPV_ARGS(&pBrowser));
    if (FAILED(hr)) {
        return NULL;
    }

    hr = pBrowser->QueryInterface(IID_PPV_ARGS(&pProvider));
    if (FAILED(hr)) {
        return NULL;
    }

    hr = pProvider->QueryService(SID_STopLevelBrowser, IID_PPV_ARGS(&pView));
    if (FAILED(hr)) {
        return NULL;
    }

    hr = pView->QueryInterface(IID_PPV_ARGS(&pFolderView));
    if (FAILED(hr)) {
        return NULL;
    }

    hr = pFolderView->GetFolder(FOLDERID_Profile, &pidl);
    if (FAILED(hr)) {
        return NULL;
    }

    hr = SHGetPathFromIDList(pidl, szPath);
    if (FAILED(hr)) {
        return NULL;
    }

    char* path = new char[MAX_PATH];
    wcstombs(path, szPath, MAX_PATH);
    return path;
}

说明

  • 该代码使用了 ATL 的智能指针来管理 COM 对象的生命周期。
  • 代码使用 Windows API 的函数 SHGetPathFromIDList 来将 PIDL 转换为路径字符串。
  • 函数 GetExplorerPath 返回一个指向路径字符串的指针,使用完毕后需要手动释放。

示例

int main() {
    CoInitialize(NULL);

    char* path = GetExplorerPath();
    if (path) {
        printf("当前活动资源管理器窗口的路径:%s\n", path);
        delete[] path;
    } else {
        printf("无法获取路径。\n");
    }

    CoUninitialize();
    return 0;
}

注意

  • 该代码只获取了当前活动资源管理器窗口的路径。如果需要获取其他打开的资源管理器窗口的路径,则需要修改代码,枚举所有窗口并根据窗口句柄进行判断。
  • 在使用该代码之前,需要包含必要的头文件,例如 <windows.h><shlobj.h><atlbase.h>
  • 使用完毕后,需要手动释放返回的路径指针。
  • 该代码只适用于 Windows 操作系统。
C++ 获取当前活动资源管理器窗口的目录路径

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

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