2012-07-06 21 views
6

मेरे पास एक खुली विंडोज एक्सप्लोरर विंडो का हैंडल है। मी:: d को \ कार्यक्रमों: \ कार्यक्रमोंमौजूदा विंडोज एक्सप्लोरर विंडो का पथ कैसे बदलें?

मैं कैसे आदेश
उदाहरण से पथ बदलने के लिए यह करने के लिए एक कमांड भेज सकते हैं।


example

अब तक मैं ShellExecute() उपयोग कर रहा था, लेकिन यह एक नई विंडो खोलता। यह अच्छा नहीं है (उपयोगकर्ता अनुभव)।

+0

आपके पास एक्सप्लोरर के लिए एचडब्ल्यूएनडी है? क्या आप इस के लिए IShellBrowser और IShellView का उपयोग करने का मतलब नहीं हैं? –

+0

@ डेविड हेफरन, मैं आपकी सिफारिश के लिए कुछ जानकारी दूंगा। धन्यवाद। –

+3

@ कबामारू: Google की कोई आवश्यकता नहीं है, क्योंकि आप जानते हैं कि आप एमएसडीएन की ओर बढ़ रहे हैं: ['आईशेलब्रोसर'] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb775123 (v = बनाम। 85) .aspx), ['IShellView'] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb774834 (v = vs.85) .aspx) –

उत्तर

4

निम्नलिखित BrowseToFolder फ़ंक्शन AHandle डिवाइस (यदि मौजूद है) के AFolderPath फ़ोल्डर (यदि मौजूद है) के विंडोज एक्सप्लोरर के मौजूदा उदाहरण को नेविगेट करता है। यदि आप दूसरे पैरामीटर को निर्दिष्ट नहीं करेंगे, तो शीर्षतम विंडो को नेविगेट करने के लिए लिया जाना चाहिए (या कम से कम प्रलेखन का दावा है; वास्तविकता सबसे पुरानी मौजूदा विंडो लेती है)। समारोह सच देता है, अगर नेविगेशन सफल रहा है, झूठी अन्यथा:

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