如何关闭从某个驱动器中打开的文件夹的Windows资源管理器窗口

c00000fd

我正在编写一个小型应用程序,它将允许用户弹出(或安全地删除)USB驱动器。我的应用程序运行正常,但在Windows资源管理器中打开USB驱动器上的文件夹(或几个文件夹)的情况除外。在这种情况下,弹出驱动器将失败,因为驱动器似乎已被锁定。

因此,我很好奇,因为用户正在通过我的应用发出命令以弹出USB驱动器,是否有任何方法可以使资源管理器从USB驱动器关闭那些打开的窗口?

PS。请注意,我不想关闭所有属于Windows资源管理器的进程,而是只关闭那些在特定驱动器上打开文件夹的进程。

丹尼斯·阿尼西莫夫(Denis Anisimov)
procedure ProcessExplorerWindows(ADriveLetter: WideChar; AClose: Boolean);
var
  ShellWindows: IShellWindows;
  i: Integer;
  Dispatch: IDispatch;
  WebBrowser2: IWebBrowser2;
  ServiceProvider: IServiceProvider;
  ShellBrowser: IShellBrowser;
  ShellView: IShellView;
  FolderView: IFolderView;
  PersistFolder2: IPersistFolder2;
  ItemIDList: PItemIDList;
  ShellFolder: IShellFolder;
  ChildItem: PItemIDList;
  Attr: DWORD;
  StrRet: TStrRet;
  FileName: UnicodeString;
  DesktopItemIDList: PItemIDList;
begin
  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
            OleCheck(Dispatch.QueryInterface(IServiceProvider, ServiceProvider));
            try
              OleCheck(ServiceProvider.QueryService(SID_STopLevelBrowser, IShellBrowser, ShellBrowser));
              try
                OleCheck(ShellBrowser.QueryActiveShellView(ShellView));
                try
                  OleCheck(ShellView.QueryInterface(IFolderView, FolderView));
                  try
                    OleCheck(FolderView.GetFolder(IPersistFolder2, PersistFolder2));
                    try
                      OleCheck(PersistFolder2.GetCurFolder(ItemIDList));
                      try
                        OleCheck(SHBindToParent(ItemIDList, IShellFolder, Pointer(ShellFolder), ChildItem));
                        try
                          Attr := SFGAO_FILESYSTEM;
                          OleCheck(ShellFolder.GetAttributesOf(1, ChildItem, Attr));
                          if Attr and SFGAO_FILESYSTEM = SFGAO_FILESYSTEM then
                            begin
                              OleCheck(ShellFolder.GetDisplayNameOf(ChildItem, SHGDN_FORPARSING, StrRet));
                              FileName := '';
                              case StrRet.uType of
                                STRRET_WSTR:
                                  begin
                                    FileName := StrRet.pOleStr;
                                    CoTaskMemFree(StrRet.pOleStr);
                                  end;
                                STRRET_OFFSET:
                                  if Assigned(ChildItem) then
                                    begin
                                      Inc(PByte(ChildItem), StrRet.uOffset);
                                      FileName := UnicodeString(PAnsiChar(ChildItem));
                                    end;
                                STRRET_CSTR:
                                  FileName := UnicodeString(AnsiString(StrRet.cStr));
                              end;
                              if ExtractFileDrive(FileName) = ADriveLetter + ':' then
                                if AClose then
                                  WebBrowser2.Quit
                                else
                                  begin
                                    SHGetFolderLocation(0, CSIDL_DESKTOP, 0, 0, DesktopItemIDList);
                                    try
                                      OleCheck(ShellBrowser.BrowseObject(DesktopItemIDList, SBSP_SAMEBROWSER or SBSP_DEFMODE or SBSP_ABSOLUTE));
                                    finally
                                      CoTaskMemFree(DesktopItemIDList);
                                    end;
                                  end;
                            end;
                        finally
                          ShellFolder := nil;
                        end;
                      finally
                        CoTaskMemFree(ItemIDList);
                      end;
                    finally
                      PersistFolder2 := nil
                    end;
                  finally
                    FolderView := nil;
                  end;
                finally
                  ShellView := nil;
                end;
              finally
                ShellBrowser := nil;
              end;
            finally
              ServiceProvider := nil;
            end;
          finally
            WebBrowser2 := nil;
          end;
        finally
          Dispatch := nil;
        end;
      end;
  finally
    ShellWindows := nil;
  end;
end;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python:如何在Windows资源管理器(Python 3.6.2,Windows 10)上打开文件夹

如何通过Python脚本在Windows资源管理器中打开文件夹?

从Windows资源管理器中的VS Code中打开文件夹

如何防止Windows资源管理器建议隐藏文件夹?

如何在Windows资源管理器的右键单击菜单中添加Windows Defender,以在Windows 8中按需扫描特定的驱动器/文件夹/文件?

如何在Nautilus文件夹资源管理器中添加书签

在文件资源管理器中打开的文件夹的历史记录

如何在Windows 8.1的资源管理器中摆脱“文件夹”和“网络位置”链接?

如何取消在Windows资源管理器中打开文件夹?

VB.NET,在Windows资源管理器中打开特定的文件夹?

重新打开Windows 10中最近关闭的文件资源管理器窗口

如何使Vista中的资源管理器记住文件夹的视图?

在Windows 7的资源管理器树中显示我的用户文件夹

从Cmd在Windows资源管理器中打开文件夹

如何使OneDrive文件夹显示在Windows资源管理器中?

Windows:全局禁用资源管理器中的文件夹类型检测

从Access中,如何打开仅知道部分文件夹名称的Windows资源管理器文件夹?

如何防止Windows资源管理器为同一文件夹打开多个窗口

vbscript在同一资源管理器窗口中打开文件夹

如何从终端显示资源管理器中的文件夹

如何在Windows资源管理器中用密码保护文件夹?

如何使用Windows资源管理器隐藏用户文件夹中的项目?

如何使用一个快捷方式在Windows 10下的cmd.exe中从Windows资源管理器打开文件夹?

在最打开的Windows资源管理器中创建新文件夹

Windows 10 文件资源管理器无法打开任何驱动器

使用批处理关闭文件资源管理器中所有打开的文件夹

如何通过 Chrome 应用程序模式窗口在资源管理器中打开本地文件夹?

如何通过 bash 在文件资源管理器中打开 Windows 启动文件夹?

防止在 Windows 资源管理器中打开重复的文件夹或子文件夹