私は開いたWindowsエクスプローラウィンドウのハンドルを持っています。 M:dまで\プログラム:\プログラム既存のWindowsエクスプローラウィンドウのパスを変更するにはどうすればよいですか?
にはどうすれば
例からのパスを変更するために、それにコマンドを送信することができます。
ShellExecute()
を使用していたが、それは新しいウィンドウが開きます。これは良くありません(ユーザーエクスペリエンス)。
私は開いたWindowsエクスプローラウィンドウのハンドルを持っています。 M:dまで\プログラム:\プログラム既存のWindowsエクスプローラウィンドウのパスを変更するにはどうすればよいですか?
にはどうすれば
例からのパスを変更するために、それにコマンドを送信することができます。
ShellExecute()
を使用していたが、それは新しいウィンドウが開きます。これは良くありません(ユーザーエクスペリエンス)。
次の関数は、指定された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;
は使用例です。
ありがとう@TLama。偉大な答え –
私は助けることができる喜んで(しかし、大きな遅れで:-) – TLama
エクスプローラにHWNDがありますか?このためにIShellBrowserとIShellViewを使用することはできませんか? –
@DavidHeffernan、私はあなたの推薦のためにいくつかの情報をgoogleします。ありがとう。 –
@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) –