Получить текущий путь оконного проводника Переполнение стека

Я на самом деле хочу определить, когда в Windows открывается определенная папка, но после некоторых исследований кажется, что это невозможно. Итак, я хочу получить текущий путь Windows Explorer, чтобы я мог сравнить его с путем к папке, о которой идет речь, но я не могу понять, как получить этот путь … У меня есть только эта функция, но она дает мне только имя папки.

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

заранее спасибо

1

Решение

Только Delphi. Переведите на 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;
-1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector