2015-04-29 3 views
1

Я действительно хочу обнаружить, когда определенная папка открыта в Windows, но после некоторых исследований кажется, что это невозможно. Итак, я хочу получить текущий путь к проводнику Windows, поэтому я мог бы сравнить его с контуром соответствующей папки, но я не могу понять, как получить этот путь ... У меня есть только эта функция, но она дает мне только имя папки.Получить текущий путь для Windows Explorer C++

string GetActiveWindowTitle() 
{ 
    char wnd_title[256]; 
    HWND hwnd=GetForegroundWindow(); 
    GetWindowText(hwnd,wnd_title,sizeof(wnd_title)); 
    return wnd_title; 
} 

Заранее спасибо

ответ

-1

Delphi только. Перевести на C++ самостоятельно.

function GetPathByExplorerHandle(AHandle: THandle): UnicodeString; 

    function GetFolderIDList(AObj: IUnknown): PItemIDList; 
    var 
     PersistFolder2: IPersistFolder2; 
     PersistIDList: IPersistIDList; 
    begin 
     if Succeeded(AObj.QueryInterface(IPersistFolder2, PersistFolder2)) then 
     try 
      if Succeeded(PersistFolder2.GetCurFolder(Result)) then Exit; 
     finally 
      PersistFolder2 := nil; 
     end; 

     if Succeeded(AObj.QueryInterface(IPersistIDList, PersistIDList)) then 
     try 
      if Succeeded(PersistIDList.GetIDList(Result)) then Exit; 
     finally 
      PersistIDList := nil; 
     end; 

     raise EOleSysError.Create('', E_NOTIMPL, 0); 
    end; 

var 
    ShellWindows: IShellWindows; 
    i: Integer; 
    Dispatch: IDispatch; 
    WebBrowser2: IWebBrowser2; 
    ServiceProvider: IServiceProvider; 
    ShellBrowser: IShellBrowser; 
    ShellView: IShellView; 
    ItemIDList: PItemIDList; 
    ShellFolder: IShellFolder; 
    ChildItem: PItemIDList; 
    StrRet: TStrRet; 
begin 
    Result := ''; 
    OleCheck(CoCreateInstance(CLASS_ShellWindows, nil, CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IShellWindows, ShellWindows)); 
    try 
    for i := ShellWindows.Count - 1 downto 0 do 
     begin 
     Dispatch := ShellWindows.Item(i); 
     try 
      OleCheck(Dispatch.QueryInterface(IWebBrowser2, WebBrowser2)); 
      try 
      if WebBrowser2.HWND = AHandle then 
       begin 
       OleCheck(Dispatch.QueryInterface(IServiceProvider, ServiceProvider)); 
       try 
        OleCheck(ServiceProvider.QueryService(SID_STopLevelBrowser, IShellBrowser, ShellBrowser)); 
        try 
        OleCheck(ShellBrowser.QueryActiveShellView(ShellView)); 
        try 
         ItemIDList := GetFolderIDList(ShellView); 
         try 
         OleCheck(SHBindToParent(ItemIDList, IShellFolder, Pointer(ShellFolder), ChildItem)); 
         try 
          OleCheck(ShellFolder.GetDisplayNameOf(ChildItem, SHGDN_FORPARSING, StrRet)); 
          case StrRet.uType of 
          STRRET_WSTR: 
           begin 
           Result := StrRet.pOleStr; 
           CoTaskMemFree(StrRet.pOleStr); 
           end; 
          STRRET_OFFSET: 
           if Assigned(ChildItem) then 
           begin 
            Inc(PByte(ChildItem), StrRet.uOffset); 
            Result := UnicodeString(PAnsiChar(ChildItem)); 
           end; 
          STRRET_CSTR: 
           Result := UnicodeString(AnsiString(StrRet.cStr)); 
          end; 
          Exit; 
         finally 
          ShellFolder := nil; 
         end; 
         finally 
         CoTaskMemFree(ItemIDList); 
         end; 
        finally 
         ShellView := nil; 
        end; 
        finally 
        ShellBrowser := nil; 
        end; 
       finally 
        ServiceProvider := nil; 
       end; 
       end; 
      finally 
      WebBrowser2 := nil; 
      end; 
     finally 
      Dispatch := nil; 
     end; 
     end; 
    finally 
    ShellWindows := nil; 
    end; 
end; 
Смежные вопросы