2012-07-06 36 views
6

Tôi có tay cầm của một cửa sổ Windows Explorer đã mở.Cách thay đổi đường dẫn của cửa sổ Windows Explorer hiện có?

Làm thế nào tôi có thể gửi một lệnh đến nó để thay đổi đường dẫn từ
dụ: m: \ chương trình để d: \ programs.


example

Đến bây giờ tôi đã sử dụng ShellExecute() nhưng nó sẽ mở ra một cửa sổ mới. Điều này không tốt (trải nghiệm người dùng).

+0

Bạn có HWND để khám phá? Bạn không có ý định sử dụng IShellBrowser và IShellView cho điều này? –

+0

@DavidHeffernan, tôi sẽ google một số thông tin cho đề xuất của bạn. Cảm ơn. –

+3

@Kabamaru: Không cần Google, vì bạn biết bạn đang hướng tới MSDN: ['IShellBrowser'] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb775123 (v = vs. 85) .aspx), ['IShellView'] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb774834 (v = vs.85) .aspx) –

Trả lời

4

Chức năng BrowseToFolder sau đây điều hướng phiên bản hiện tại của Windows Explorer của bộ xử lý AHandle đã cho (nếu có) thành thư mục AFolderPath (nếu có). Nếu bạn không chỉ định tham số thứ hai, cửa sổ trên cùng cần được thực hiện để điều hướng (hoặc ít nhất là tài liệu xác nhận rằng; thực tế dường như có cửa sổ cũ nhất hiện có). Hàm trả về True, nếu điều hướng đã thành công, False khác:

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; 

Dưới đây là cách sử dụng ví dụ:

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; 

Đây là một complete testing projectthe blog post từ mà tôi đã đưa ra những cảm hứng.

+0

Cảm ơn bạn @TLama. Câu trả lời tuyệt vời –

+2

Vui vì tôi có thể giúp (với một sự chậm trễ lớn mặc dù :-) – TLama

Các vấn đề liên quan