How to change the path to an existing Windows Explorer window?

I have a handle to the open windows explorer window.

How can I send him a command to change the path from
Example: m: \ program to d: \ programs.


example

So far I have used ShellExecute() , but it opens a new window. This is not very good (user experience).

+6
source share
1 answer

The following BrowseToFolder function moves an existing instance of Windows Explorer of this AHandle handle (if one exists) to the AFolderPath folder (if one exists). Unless you specify a second parameter, the topmost window should be taken for navigation (or at least the documentation claims that reality seems to occupy the oldest existing window). The function returns True if the navigation was successful, False otherwise:

 uses ActiveX, ShlObj, ShellAPI, SHDocVw; const IID_IServiceProvider: TGUID = '{6D5140C1-7436-11CE-8034-00AA006009FA}'; SID_STopLevelBrowser: TGUID = '{4C96BE40-915C-11CF-99D3-00AA004AE837}'; function GetItemIDListFromPath(const AFolderPath: WideString): PItemIDList; var Count: ULONG; Attributes: ULONG; ShellFolder: IShellFolder; begin Result := nil; if Succeeded(SHGetDesktopFolder(ShellFolder)) then begin Count := 0; if Failed(ShellFolder.ParseDisplayName(0, nil, PWideChar(AFolderPath), Count, Result, Attributes)) then Result := nil; end; end; function BrowseToFolder(const AFolderPath: WideString; AHandle: HWND = HWND_TOPMOST): Boolean; var I: Integer; WndIface: IDispatch; ItemIDList: PItemIDList; ShellBrowser: IShellBrowser; ShellWindows: IShellWindows; WebBrowserApp: IWebBrowserApp; ServiceProvider: IServiceProvider; begin Result := False; if Succeeded(CoCreateInstance(CLASS_ShellWindows, nil, CLSCTX_LOCAL_SERVER, IID_IShellWindows, ShellWindows)) then begin for I := 0 to ShellWindows.Count - 1 do begin if (AHandle <> HWND_TOPMOST) then WndIface := ShellWindows.Item(VarAsType(I, VT_I4)) else WndIface := ShellWindows.Item(VarAsType(SWC_EXPLORER, VT_UI4)); if Succeeded(WndIface.QueryInterface(IID_IWebBrowserApp, WebBrowserApp)) then begin if (AHandle = HWND_TOPMOST) or (WebBrowserApp.HWnd = AHandle) then begin if Succeeded(WebBrowserApp.QueryInterface(IID_IServiceProvider, ServiceProvider)) then begin if Succeeded(ServiceProvider.QueryService(SID_STopLevelBrowser, IID_IShellBrowser, ShellBrowser)) then begin ItemIDList := GetItemIDListFromPath(AFolderPath); Result := Succeeded(ShellBrowser.BrowseObject(ItemIDList, SBSP_SAMEBROWSER or SBSP_ABSOLUTE)); end; end; Break; end; end; end; end; end; 

Here is a usage example:

 procedure TForm1.Button1Click(Sender: TObject); var ExplorerHandle: HWND; begin ExplorerHandle := 123456; if not BrowseToFolder('c:\Windows\System32\', ExplorerHandle) then ShowMessage('Navigation to a folder failed!') else ShowMessage('Navigation to a folder succeeded!'); end; 

Here is the complete testing project and the blog post from which I breathed inspiration.

+4
source

Source: https://habr.com/ru/post/919835/


All Articles