Как изменить путь к существующему окну Windows Explorer?

У меня есть дескриптор открытого окна проводника Windows.

Как я могу отправить ему команду, чтобы изменить путь от
Пример: m:\program to d:\programs.


example

До сих пор я использовал ShellExecute(), но он открывает новое окно. Это не очень хорошо (пользовательский опыт).

+6
06 июл. '12 в 9:45
источник поделиться
1 ответ

Следующая функция BrowseToFolder перемещает существующий экземпляр проводника Windows данного дескриптора AHandle (если существует) в папку AFolderPath (если существует). Если вы не укажете второй параметр, самое верхнее окно должно быть принято для навигации (или, по крайней мере, документация утверждает, что реальность, похоже, занимает самое старое существующее окно). Функция возвращает True, если навигация прошла успешно, False в противном случае:

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;

Вот пример использования:

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;

Вот complete testing project и the blog post из которого я вдохнул вдохновение.

+4
03 мар. '13 в 4:49
источник

Посмотрите другие вопросы по меткам или Задайте вопрос