C# bestimmtes Explorer Fenster schließen



  • Hallo,

    ich möchte ein bestimmtes Explorer Fenster schließen, welches unter einem bestimmten Pfad geöffnet ist.

    zB. wenn der Ordner Test unter C:\Benutzer\Krx\Desktop\Test geöffnet ist dann möchte ich NUR DIESEN Ordner schlißen

    momentan habe ich folgendes:

    if (folderPath.Contains(path) == true)
                    {
                        string result = new DirectoryInfo(folderPath).Name;
                        foreach (Process p in Process.GetProcessesByName("explorer"))
                        {
                            if (p.MainWindowTitle.Contains(result))
                            {
                                p.Kill();
                            }
                        }
                    }
    

    damit klappt es zwar schonmal, jedoch werden alle geöffneten Ordner geschlossen. Leider bekomme ich dabei auch noch einen fehler wenn unter den geöffneten Ordnern "Dieser PC" (windows 10) geöffnet ist



  • @krx sagte in C# bestimmtes Explorer Fenster schließen:

    p.Kill();
    

    Du willst ein einzelnes Fenster schließen, nicht den ganzen Prozess abschießen. Guckst Du: How to close the window by its name?



  • hallo,

    danke für den link. Ich hatte vergessen zu erwähnen, das ich das vorher auch schon probiert hatte (anderer Ansatz), jedoch wurde das Fenster nur geschlossen wenn ich zB in dem Ordner Test war.

    Ich wollte den Weg mit dem Pfad gehen, da ich auch diesen schließen möchte wenn ich mich in einem Unterordner befinde zB C:\Benutzer\Krx\Desktop\Test\01\07



  • So wie du es machst prüfst du nur einen Fenstertitel pro Prozess. Nun hast du auf aktuellen Windowsen allerdings genau zwei* Explorer Prozesse: einen für Desktop und Taskbar und einen für alle offenen Explorer Fenster. Bei p.MainWindowTitle wirst du dann vermutlich einfach den Titel des ersten Explorer Fensters bekommen das geöffnet wurde.

    D.h. du solltest vermutlich eher top-level Fenster enumerieren und nicht Prozesse. Und bei jedem top-level Fenster dann gucken ob es zu einem Explorer Prozess gehört und dann den Fenstertitel checken. Und dann das Fenster schliessen und nicht den ganzen Prozess - wie Swordfish ja schon geschrieben hat.

    Und natürlich wird der Test über den Fenstertitel vermutlich nur funktionieren wenn die "show full path in window title" (oder wie auch immer die genau heisst) Option aktiv ist. Ansonsten hast du im Fenstertitel nur den Namen des offenen Ordners, ohne den Pfad davor.

    *: Wenn keine Explorer Fenster offen sind dann hast du nur den einen Explorer Prozess für den Desktop.



  • ok ich habe mir nochmal den link von swordfish angesehen und ein wenig gegrübelt und habe nun die Lösung aus dem Link mit meinem obenren code ergänzt.

    ich lasse nun überprüfen ob mein Ordner zB Test oder darin enthaltene unterordner geöffnet sind und falls ja nehme ich mir den unterordner namen und schließe diesen mit dem code aus dem link.

    ich nehme nur den Ordner namen und nicht den ganzen pfad da bei mir in win10 nur der Ordnername angezeigt wird und ich nicht den ganzen Pfad sehen will.

       [DllImport("user32.dll", SetLastError = true)]
    
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        /// <summary>
        /// Find window by Caption only. Note you must pass IntPtr.Zero as the first parameter.
        /// </summary>
        [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
        static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);
    
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
    
        const UInt32 WM_CLOSE = 0x0010;
    
        void checkOpenFolders()
        {
            SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindows();
    
            string filename, folderPath = "";
            foreach (SHDocVw.InternetExplorer ie in shellWindows)
            {
                filename = Path.GetFileNameWithoutExtension(ie.FullName).ToLower();
    
                if (filename.Equals("explorer"))
                {
                    folderPath = ie.LocationURL;
                }
                folderPath = folderPath.Substring(8);
                folderPath = folderPath.Replace("/", "\\");
                folderPath = folderPath.Replace("%20", " ");
                if (folderPath.Contains(path) == true)
                {
                    string result = new DirectoryInfo(folderPath).Name;
                    IntPtr windowPtr = FindWindowByCaption(IntPtr.Zero, result);
                    if (windowPtr == IntPtr.Zero)
                    {
                        //textBox1.Text = "Window not found";
                        return;
                    }
                    SendMessage(windowPtr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
                }
            }
        }

Anmelden zum Antworten