Есть ли способ закрыть конкретный экземпляр explorer с помощью C#?

Я ищу способ закрыть окно Проводника Windows, которое открыто для определенной папки. Сказать c:usersbobfolder. Я могу закрыть всех исследователей с помощью кода ниже, но это, очевидно, не то, что я хочу сделать. Возможно ли это?

 foreach (Process p in Process.GetProcessesByName("explorer"))
 {
    p.Kill();
 }

спасибо

4 ответов


эта статья, которая получила меня большую часть пути:http://omegacoder.com/?p=63

Я нашел способ использовать com-библиотеку под названием "Microsoft Internet Controls", которая больше подходит для Internet Explorer, но я отказался от попыток использовать ID процесса и MainWindowTitle материал с explorer.exe использует только один процесс для всех открытых окон, и я не мог определить, как получить текст заголовка окна или расположение файловой системы из этого.

Итак, во-первых, добавить ссылка на Microsoft Internet Controls на вкладке COM, затем:

using SHDocVw;

эта маленькая рутина сделала трюк для меня:

ShellWindows _shellWindows = new SHDocVw.ShellWindows();
string processType;

foreach (InternetExplorer ie in _shellWindows)
{
    //this parses the name of the process
    processType = Path.GetFileNameWithoutExtension(ie.FullName).ToLower();

    //this could also be used for IE windows with processType of "iexplore"
    if (processType.Equals("explorer") && ie.LocationURL.Contains(@"C:/Users/Bob"))
        {
            ie.Quit();
        }    
}

одно предостережение, и, вероятно, из-за того, что эта библиотека ориентирована на IE, вы должны использовать косые черты в пути к папке... Это потому, что истинный LocationURL что возвращается из ie объект находится в форме file:///C:/Users/...


Я бы попробовал импортировать user32.dll и вызов FindWindow или FindWindowByCaption, а затем вызов DestroyWindow.

информация о FindWindow здесь: http://www.pinvoke.net/default.aspx/user32.findwindow


вы можете попробовать что-то вроде этого:

foreach (Process p in Process.GetProcessesByName("explorer"))
{
  if (p.MainWindowTitle.ToLower().Contains(@"c:\users\bob\folder"))  
    p.Kill();
}

foreach (Process p in Process.GetProcessesByName("explorer"))
{
    if (p.MainWindowTitle.Contains("YourFolderName"))
    {
        p.Kill();
    }
}