修改已打开的文件夹路径

本文关键字:文件夹 路径 修改 | 更新日期: 2023-09-27 17:49:45

假设用户有一个打开的资源管理器窗口,其中打开了文件夹W:'abc

我有两个问题:

  1. 我能知道文件夹W:'abc当前是否打开吗?
  2. 我可以更改当前打开的文件夹的路径吗?例如:W:' ?

修改已打开的文件夹路径

我认为这是不可能的。

您可以这样做,但是您需要使用大量对本机代码的调用。Raymond Chen有一个如何在C中直接调用WinAPI的例子:

从资源管理器窗口查询信息

我还没有完全评估代码,但我很有信心它可以转换为c#。但是,您需要大量的P/Invoke和C知识才能做到这一点。

回答您的第一个问题,这取决于您的操作系统版本,但我过去使用Shell文档查看器来获取系统上当前打开的所有Shell窗口的列表。然后,您可以相应地过滤shellWindows列表。

SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindowsClass();
string fileName;
foreach ( SHDocVw.InternetExplorer ie in shellWindows )
{
    fileName = Path.GetFileNameWithoutExtension( ie.FullName ).ToLower();
    if ( fileName( "explorer" ) )
        Console.WriteLine( "Explorer looking at : {0}", ie.LocationURL );
}

另一种方法是获取所有运行进程的列表,过滤explorer.exe,然后使用Process获取当前打开的路径。MainWindowTitle:

var processList = Process.GetProcesses();
foreach (Process process in processList)
{
    // do something here with process.MainWindowTitle
}

1)您可以列举所有打开的资源管理器实例,并将您的文件夹与每个资源管理器实例的当前文件夹进行比较。枚举样本。

2)你可以调用IShellBrowser对象的BrowseObject方法来导航到新的文件夹。示例:

procedure BrowseToFolder(AShellBrowser: IShellBrowser; const AFolder: UnicodeString);
var
  DesktopFolder: IShellFolder;
  Eaten: DWORD;
  IDList: PItemIDList;
  Attr: DWORD;
begin
  SHGetDesktopFolder(DesktopFolder);
  try
    Attr := 0;
    OleCheck(DesktopFolder.ParseDisplayName(0, nil, PWideChar(AFolder), Eaten, IDList, Attr));
    try
      AShellBrowser.BrowseObject(IDList, SBSP_ABSOLUTE);
    finally
      CoTaskMemFree(IDList);
    end;
  finally
    DesktopFolder := nil;
  end;
end;