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 project
và the blog post
từ mà tôi đã đưa ra những cảm hứng.
Bạn có HWND để khám phá? Bạn không có ý định sử dụng IShellBrowser và IShellView cho điều này? –
@DavidHeffernan, tôi sẽ google một số thông tin cho đề xuất của bạn. Cảm ơn. –
@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) –