gpt4 book ai didi

c++ - 获取windows explorer C++的当前路径

转载 作者:太空宇宙 更新时间:2023-11-04 14:31:26 28 4
gpt4 key购买 nike

我实际上想检测在 Windows 上打开特定文件夹的时间,但经过一些研究后,它似乎是不可能的。所以,我想获取 Windows 资源管理器的当前路径,所以我可以将它与相关文件夹的路径进行比较,但我无法弄清楚如何获取此路径......我只有这个功能但它只给我文件夹的名称。

string GetActiveWindowTitle()
{
char wnd_title[256];
HWND hwnd=GetForegroundWindow();
GetWindowText(hwnd,wnd_title,sizeof(wnd_title));
return wnd_title;
}

提前致谢

最佳答案

仅限德尔福。自己翻译成 C++。

function GetPathByExplorerHandle(AHandle: THandle): UnicodeString;

function GetFolderIDList(AObj: IUnknown): PItemIDList;
var
PersistFolder2: IPersistFolder2;
PersistIDList: IPersistIDList;
begin
if Succeeded(AObj.QueryInterface(IPersistFolder2, PersistFolder2)) then
try
if Succeeded(PersistFolder2.GetCurFolder(Result)) then Exit;
finally
PersistFolder2 := nil;
end;

if Succeeded(AObj.QueryInterface(IPersistIDList, PersistIDList)) then
try
if Succeeded(PersistIDList.GetIDList(Result)) then Exit;
finally
PersistIDList := nil;
end;

raise EOleSysError.Create('', E_NOTIMPL, 0);
end;

var
ShellWindows: IShellWindows;
i: Integer;
Dispatch: IDispatch;
WebBrowser2: IWebBrowser2;
ServiceProvider: IServiceProvider;
ShellBrowser: IShellBrowser;
ShellView: IShellView;
ItemIDList: PItemIDList;
ShellFolder: IShellFolder;
ChildItem: PItemIDList;
StrRet: TStrRet;
begin
Result := '';
OleCheck(CoCreateInstance(CLASS_ShellWindows, nil, CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IShellWindows, ShellWindows));
try
for i := ShellWindows.Count - 1 downto 0 do
begin
Dispatch := ShellWindows.Item(i);
try
OleCheck(Dispatch.QueryInterface(IWebBrowser2, WebBrowser2));
try
if WebBrowser2.HWND = AHandle then
begin
OleCheck(Dispatch.QueryInterface(IServiceProvider, ServiceProvider));
try
OleCheck(ServiceProvider.QueryService(SID_STopLevelBrowser, IShellBrowser, ShellBrowser));
try
OleCheck(ShellBrowser.QueryActiveShellView(ShellView));
try
ItemIDList := GetFolderIDList(ShellView);
try
OleCheck(SHBindToParent(ItemIDList, IShellFolder, Pointer(ShellFolder), ChildItem));
try
OleCheck(ShellFolder.GetDisplayNameOf(ChildItem, SHGDN_FORPARSING, StrRet));
case StrRet.uType of
STRRET_WSTR:
begin
Result := StrRet.pOleStr;
CoTaskMemFree(StrRet.pOleStr);
end;
STRRET_OFFSET:
if Assigned(ChildItem) then
begin
Inc(PByte(ChildItem), StrRet.uOffset);
Result := UnicodeString(PAnsiChar(ChildItem));
end;
STRRET_CSTR:
Result := UnicodeString(AnsiString(StrRet.cStr));
end;
Exit;
finally
ShellFolder := nil;
end;
finally
CoTaskMemFree(ItemIDList);
end;
finally
ShellView := nil;
end;
finally
ShellBrowser := nil;
end;
finally
ServiceProvider := nil;
end;
end;
finally
WebBrowser2 := nil;
end;
finally
Dispatch := nil;
end;
end;
finally
ShellWindows := nil;
end;
end;

关于c++ - 获取windows explorer C++的当前路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29951909/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com