假设用户有一个打开的资源管理器窗口,其上打开了文件夹W:\abc
。
我有两个问题:
W:\abc
当前是否已打开? W:\
?答案 0 :(得分:0)
我不认为这是可能的。我不知道以这种方式与正在运行的资源管理器进程交互的方式。
答案 1 :(得分:0)
要回答您的第一个问题,这取决于您的操作系统版本,但我已使用Shell Document Viewer获取过去系统中所有当前打开的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
}
答案 2 :(得分:0)
您可以执行此操作,但需要对本机代码使用大量调用。 Raymond Chen有一个如何使用C:
中的直接WinAPI调用来执行此操作的示例Querying information from an Explorer window
我没有完全评估代码,但我相信它可以转换为C#。尽管如此,你还是需要大量的P / Invoke和C知识。
答案 3 :(得分:0)
1)您可以枚举所有打开的Explorer实例,并将您的文件夹与每个Explorer实例的当前文件夹进行比较。 Sample of enumeration
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;