C++ 获取当前活动资源管理器窗口的目录路径
使用 C++ 获取当前活动资源管理器窗口的目录路径
本文将介绍如何使用 C++ 和 Windows API 获取当前活动资源管理器窗口的目录路径。
思路
- 使用
IShellWindows接口枚举所有打开的资源管理器窗口。 - 通过相关接口获取每个窗口的句柄和当前文件夹的 PIDL(程序标识列表)。
- 如果窗口句柄与
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 操作系统。
原文地址: https://www.cveoy.top/t/topic/oFDE 著作权归作者所有。请勿转载和采集!