Я хотел бы получить Путь окон, который имеет фокус.
Пример: у меня есть 3 окна.
а. C:\Windows
б. C:\Windows\System32
с. C:\Users\COMP-0\Documents
И я работаю над c (C:\Users\COMP-0\Documents)
Поэтому я хотел бы получить этот путь (C:\Users\COMP-0\Documents) программно в С#.
Расширяя этот ответ, чтобы получить выбранные файлы в папке, вы можете использовать аналогичный подход, чтобы получить текущую папку и, следовательно, ее путь.
Это требует некоторого COM и требует:
GetForegroundWindow
InternetExplorer
с помощью SHDocVw.ShellWindows
,IShellFolderViewDual2
COM.Есть несколько предостережений, о которых нужно знать:
GUID
указывает на CLSID для этой папки в реестре. Вероятно, возможно преобразовать это значение в путь.null
для текущей папкиЕсли в специальной папке или на рабочем столе этот код просто вернет текущий заголовок окна - как правило, имя специальной папки - используя данные в этом ответе.
private static string GetActiveExplorerPath()
{
// get the active window
IntPtr handle = GetForegroundWindow();
// Required ref: SHDocVw (Microsoft Internet Controls COM Object) - C:\Windows\system32\ShDocVw.dll
ShellWindows shellWindows = new SHDocVw.ShellWindows();
// loop through all windows
foreach (InternetExplorer window in shellWindows)
{
// match active window
if (window.HWND == (int)handle)
{
// Required ref: Shell32 - C:\Windows\system32\Shell32.dll
var shellWindow = window.Document as Shell32.IShellFolderViewDual2;
// will be null if you are in Internet Explorer for example
if (shellWindow != null)
{
// Item without an index returns the current object
var currentFolder = shellWindow.Folder.Items().Item();
// special folder - use window title
// for some reason on "Desktop" gives null
if (currentFolder == null || currentFolder.Path.StartsWith("::"))
{
// Get window title instead
const int nChars = 256;
StringBuilder Buff = new StringBuilder(nChars);
if (GetWindowText(handle, Buff, nChars) > 0)
{
return Buff.ToString();
}
}
else
{
return currentFolder.Path;
}
}
break;
}
}
return null;
}
// COM Imports
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);