有没有办法用C#关闭特定的资源管理器实例?

时间:2012-11-19 22:40:11

标签: c# process

我正在寻找一种方法来关闭对某个文件夹打开的Windows资源管理器窗口。说c:\ users \ bob \文件夹。我可以用下面的代码关闭所有的探险家,但这显然不是我想做的。这可能吗?

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

由于

5 个答案:

答案 0 :(得分:17)

这篇文章让我大部分时间都在那里:http://omegacoder.com/?p=63

我找到了一种方法,使用名为“Microsoft Internet Controls”的COM库看起来更适用于Internet Explorer,但我放弃了尝试使用进程ID和MainWindowTitle的东西,因为explorer.exe只使用一个进程对于所有打开的窗口,我无法确定如何从中获取窗口标题文本或文件系统位置。

首先,从COM选项卡添加对Microsoft Internet Controls的引用,然后:

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,你必须在你的文件夹路径中使用正斜杠......这是因为{{1}返回的真LocationURL对象的格式为ie

答案 1 :(得分:2)

我会尝试导入user32.dll并调用FindWindow或FindWindowByCaption,然后调用DestroyWindow。

有关FindWindow的信息在这里: http://www.pinvoke.net/default.aspx/user32.findwindow

答案 2 :(得分:1)

您可以尝试这样的事情:

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

这有效。这是Jeff Roe帖子的后续内容。

// Find window by Caption only. Note you must pass IntPtr.Zero as the first parameter.
[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
public static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, StringBuilder lParam);

// caption is the window title.
public void CloseWindowsExplorer(string caption)
{
    IntPtr i = User32.FindWindowByCaption(IntPtr.Zero, caption);
    if (i.Equals(IntPtr.Zero) == false)
    {
        // WM_CLOSE is 0x0010
        IntPtr result = User32.SendMessage(i, 0x0010, IntPtr.Zero, null);
    }
}