c++ 获取当前聚焦IShellWindows的路径
要获取当前聚焦IShellWindows的路径,需要先获取当前聚焦的窗口句柄,然后使用FindWindowEx函数查找该窗口句柄下的子窗口,找到具有"WorkerW"类名的子窗口,最后使用SHGetPathFromIDList函数获取该子窗口的路径。
以下是示例代码:
#include <windows.h>
#include <shlobj.h>
#include <atlbase.h>
int main()
{
// 获取当前聚焦窗口句柄
HWND hwnd = GetForegroundWindow();
// 查找WorkerW类名的子窗口
HWND workerw = NULL;
HWND child = FindWindowEx(hwnd, NULL, "SHELLDLL_DefView", NULL);
if (child != NULL)
{
workerw = FindWindowEx(child, NULL, "WorkerW", NULL);
}
// 获取子窗口路径
TCHAR path[MAX_PATH] = { 0 };
if (workerw != NULL)
{
CComPtr<IShellWindows> psw;
HRESULT hr = CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&psw));
if (SUCCEEDED(hr))
{
VARIANT v;
v.vt = VT_I4;
v.lVal = (LONG_PTR)workerw;
IDispatch* pdisp = NULL;
hr = psw->FindWindowSW(&v, &pdisp, SWC_DESKTOP);
if (SUCCEEDED(hr))
{
CComQIPtr<IShellBrowser> psb(pdisp);
if (psb != NULL)
{
CComPtr<IShellView> psv;
hr = psb->QueryActiveShellView(&psv);
if (SUCCEEDED(hr))
{
CComPtr<IFolderView2> pfv2;
hr = psv->QueryInterface(IID_PPV_ARGS(&pfv2));
if (SUCCEEDED(hr))
{
ITEMIDLIST* pidl;
hr = pfv2->GetSelectedItem(0, &pidl);
if (SUCCEEDED(hr))
{
SHGetPathFromIDList(pidl, path);
CoTaskMemFree(pidl);
}
}
}
}
pdisp->Release();
}
}
}
// 输出路径
wprintf(L"%s\n", path);
return 0;
}
``
原文地址: https://www.cveoy.top/t/topic/hfJ6 著作权归作者所有。请勿转载和采集!