【问题标题】:Get current path of windows explorer C++获取windows explorer C++的当前路径
【发布时间】:2015-07-09 05:19:04
【问题描述】:

我实际上想检测在 Windows 上打开特定文件夹的时间,但经过一些研究,这似乎是不可能的。所以,我想获取Windows资源管理器的当前路径,所以我可以将它与相关文件夹的路径进行比较,但我不知道如何获取这个路径......我只有这个功能但它只给我文件夹的名称。

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

提前致谢

【问题讨论】:

    标签: c++ windows path window explorer


    【解决方案1】:

    仅限德尔福。自己翻译成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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-18
      • 2012-05-29
      • 2012-02-03
      • 2016-09-01
      • 2018-04-13
      • 2020-04-16
      • 1970-01-01
      • 2014-01-30
      相关资源
      最近更新 更多