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

本示例展示如何使用 Win32 API 获取当前活动资源管理器窗口的路径,并将其包装成一个函数返回。

代码示例

#include <Windows.h>
#include <ShlObj.h>
#include <ShObjIdl.h>

char* GetExplorerPath() {
    // 初始化 COM
    CoInitialize(NULL);

    // 创建 IShellWindows 实例
    IShellWindows* pShellWindows;
    CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL, IID_IShellWindows, (void**)&pShellWindows);

    // 枚举所有 Explorer 窗口
    HWND hwndExplorer = NULL;
    IDispatch* pDispatch;
    IWebBrowserApp* pBrowser;
    long count;
    pShellWindows->get_Count(&count);
    for (int i = 0; i < count; i++) {
        pShellWindows->Item(CComVariant(i), &pDispatch);
        pBrowser = NULL;
        pDispatch->QueryInterface(IID_IWebBrowserApp, (void**)&pBrowser);
        if (pBrowser != NULL) {
            pBrowser->get_HWND((SHANDLE_PTR*)&hwndExplorer);
            if (hwndExplorer == GetForegroundWindow()) {
                // 获取当前文件夹的 PIDL
                LPITEMIDLIST pidl;
                SHGetSpecialFolderLocation(hwndExplorer, CSIDL_DESKTOP, &pidl);

                // 将 PIDL 转换为路径
                char path[MAX_PATH];
                SHGetPathFromIDList(pidl, path);

                // 释放资源
                ILFree(pidl);
                pBrowser->Release();
                pDispatch->Release();
                pShellWindows->Release();

                // 结束 COM
                CoUninitialize();

                // 返回路径
                return path;
            }
            pBrowser->Release();
        }
        pDispatch->Release();
    }

    // 释放资源
    pShellWindows->Release();

    // 结束 COM
    CoUninitialize();

    // 如果没有 Explorer 窗口处于前台,则返回 NULL
    return NULL;
}

代码说明

  1. 初始化 COM 库:使用 CoInitialize(NULL) 初始化 COM 库。
  2. 创建 IShellWindows 实例:使用 CoCreateInstance 创建一个 IShellWindows 实例,用于枚举所有 Explorer 窗口。
  3. 枚举所有 Explorer 窗口:使用 IShellWindows::get_Count 获取窗口数量,并使用 IShellWindows::Item 获取每个窗口的 IDispatch 接口。
  4. 获取窗口句柄:使用 IWebBrowserApp::get_HWND 获取每个窗口的句柄。
  5. 判断当前窗口是否处于前台:使用 GetForegroundWindow 获取当前活动窗口的句柄,并与每个 Explorer 窗口的句柄进行比较。
  6. 获取当前文件夹的 PIDL:使用 SHGetSpecialFolderLocation 获取当前文件夹的 PIDL。
  7. 将 PIDL 转换为路径:使用 SHGetPathFromIDList 将 PIDL 转换为路径。
  8. 释放资源:释放所有创建的 COM 对象和 PIDL。
  9. 结束 COM 库:使用 CoUninitialize 结束 COM 库。

使用示例

int main() {
    char* path = GetExplorerPath();
    if (path != NULL) {
        printf("当前资源管理器窗口路径:%s\n", path);
    } else {
        printf("当前没有资源管理器窗口处于前台。\n");
    }
    return 0;
}

注意

  • 在使用此函数之前,需要包含头文件 Windows.hShlObj.hShObjIdl.h
  • 函数返回一个指向字符串的指针,需要在使用后释放内存。
  • 如果没有 Explorer 窗口处于前台,则函数将返回 NULL。
  • 此代码仅适用于 Windows 操作系统。
C++ 获取当前活动资源管理器窗口的路径

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

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