2012-07-06 20 views
6

私は開いたWindowsエクスプローラウィンドウのハンドルを持っています。 M:dまで\プログラム:\プログラム既存のWindowsエクスプローラウィンドウのパスを変更するにはどうすればよいですか?

にはどうすれば
例からのパスを変更するために、それにコマンドを送信することができます。


example

は、今まで私がShellExecute()を使用していたが、それは新しいウィンドウが開きます。これは良くありません(ユーザーエクスペリエンス)。

+0

エクスプローラにHWNDがありますか?このためにIShellBrowserとIShellViewを使用することはできませんか? –

+0

@DavidHeffernan、私はあなたの推薦のためにいくつかの情報をgoogleします。ありがとう。 –

+3

@Kabamaru:あなたはMSDNに向かっていることを知っているので、Googleには必要ありません:['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) –

答えて

4

次の関数は、指定されたAHandleハンドル(存在する場合)のWindowsエクスプローラの既存インスタンスをAFolderPathフォルダ(存在する場合)にナビゲートします。 2番目のパラメータを指定しない場合は、一番上のウィンドウを移動する必要があります(または、ドキュメントでは少なくとも現実のウィンドウが最も古いと思われます)。ナビゲーションが成功した場合、この関数は、そうでなければFalse、Trueを返します。ここでは

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です:

ここ
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; 

は使用例です。

+0

ありがとう@TLama。偉大な答え –

+2

私は助けることができる喜んで(しかし、大きな遅れで:-) – TLama

関連する問題