假設用戶有一個打開的資源管理器窗口,並在其上打開文件夾W:\abc
。修改已打開的文件夾路徑
我有兩個問題:
- 我能知道,如果該文件夾
W:\abc
目前開的呢? - 我可以更改當前打開的文件夾的路徑嗎?例如讓它
W:\
?
假設用戶有一個打開的資源管理器窗口,並在其上打開文件夾W:\abc
。修改已打開的文件夾路徑
我有兩個問題:
W:\abc
目前開的呢?W:\
?我不認爲這是可能的。我不知道用這種方式與正在運行的Explorer進程進行交互的方式。
要回答你的第一個問題,它取決於你的操作系統版本,但我已經使用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
}
你可以這樣做,但你需要使用大量的本地代碼調用。雷蒙德陳有如何在C直接調用WinAPI的做到這一點的例子:
Querying information from an Explorer window
我還沒有充分評估的代碼,但我非常有信心它可以被轉換爲C#。你需要大量的P/Invoke和C的知識才能做到這一點。
1)您可以枚舉Explorer的所有打開的實例,並將您的文件夾與Explorer的每個實例的當前文件夾進行比較。 Sample of enumeration。
2)您可以撥打BrowseObject方法的IShellBrowser對象導航到新的文件夾。樣品:
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;