C++ 获取当前活动资源管理器窗口的路径
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;
}
代码说明
- 初始化 COM 库:使用
CoInitialize(NULL)初始化 COM 库。 - 创建 IShellWindows 实例:使用
CoCreateInstance创建一个IShellWindows实例,用于枚举所有 Explorer 窗口。 - 枚举所有 Explorer 窗口:使用
IShellWindows::get_Count获取窗口数量,并使用IShellWindows::Item获取每个窗口的IDispatch接口。 - 获取窗口句柄:使用
IWebBrowserApp::get_HWND获取每个窗口的句柄。 - 判断当前窗口是否处于前台:使用
GetForegroundWindow获取当前活动窗口的句柄,并与每个 Explorer 窗口的句柄进行比较。 - 获取当前文件夹的 PIDL:使用
SHGetSpecialFolderLocation获取当前文件夹的 PIDL。 - 将 PIDL 转换为路径:使用
SHGetPathFromIDList将 PIDL 转换为路径。 - 释放资源:释放所有创建的 COM 对象和 PIDL。
- 结束 COM 库:使用
CoUninitialize结束 COM 库。
使用示例
int main() {
char* path = GetExplorerPath();
if (path != NULL) {
printf("当前资源管理器窗口路径:%s\n", path);
} else {
printf("当前没有资源管理器窗口处于前台。\n");
}
return 0;
}
注意
- 在使用此函数之前,需要包含头文件
Windows.h、ShlObj.h和ShObjIdl.h。 - 函数返回一个指向字符串的指针,需要在使用后释放内存。
- 如果没有 Explorer 窗口处于前台,则函数将返回 NULL。
- 此代码仅适用于 Windows 操作系统。
原文地址: https://www.cveoy.top/t/topic/oFDK 著作权归作者所有。请勿转载和采集!