C # Получить Windows Explore Path, который имеет фокус

1

Я хотел бы получить Путь окон, который имеет фокус.

Пример: у меня есть 3 окна.
а. C:\Windows
б. C:\Windows\System32
с. C:\Users\COMP-0\Documents

И я работаю над c (C:\Users\COMP-0\Documents)

Поэтому я хотел бы получить этот путь (C:\Users\COMP-0\Documents) программно в С#.

Теги:
winforms

1 ответ

4

Расширяя этот ответ, чтобы получить выбранные файлы в папке, вы можете использовать аналогичный подход, чтобы получить текущую папку и, следовательно, ее путь.

Это требует некоторого COM и требует:

  • Получение активного окна с помощью GetForegroundWindow
  • Найдите текущий список окон InternetExplorer с помощью SHDocVw.ShellWindows,
  • Соответствующие указатели на ручки для поиска текущего окна
  • Получение пути к папке внутри активного окна с использованием интерфейса IShellFolderViewDual2 COM.

Есть несколько предостережений, о которых нужно знать:

  • Специальные папки (Избранное, Мой компьютер и т.д.) Предоставят вам путь к файлу как ":: {GUID}", где GUID указывает на CLSID для этой папки в реестре. Вероятно, возможно преобразовать это значение в путь.
  • Переход на "Рабочий стол" возвращает null для текущей папки
  • Фокусирование Internet Explorer вызовет совпадение в активном окне, поэтому нам нужно убедиться, что мы находимся в папке с оболочкой

Если в специальной папке или на рабочем столе этот код просто вернет текущий заголовок окна - как правило, имя специальной папки - используя данные в этом ответе.

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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню