Есть ли способ закрыть конкретный экземпляр 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();
}
}