2014-03-12 67 views
0

假設用戶有一個打開的資源管理器窗口,並在其上打開文件夾W:\abc修改已打開的文件夾路徑

我有兩個問題:

  1. 我能知道,如果該文件夾W:\abc目前開的呢?
  2. 我可以更改當前打開的文件夾的路徑嗎?例如讓它W:\

回答

0

我不認爲這是可能的。我不知道用這種方式與正在運行的Explorer進程進行交互的方式。

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 
} 
0

你可以這樣做,但你需要使用大量的本地代碼調用。雷蒙德陳有如何在C直接調用WinAPI的做到這一點的例子:

Querying information from an Explorer window

我還沒有充分評估的代碼,但我非常有信心它可以被轉換爲C#。你需要大量的P/Invoke和C的知識才能做到這一點。

0

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;