Laden...

Explorerfenster in den Vordergrund mit Beachtung des Pfades

Erstellt von Stoffel000 vor einem Jahr Letzter Beitrag vor einem Jahr 502 Views
S
Stoffel000 Themenstarter:in
11 Beiträge seit 2021
vor einem Jahr
Explorerfenster in den Vordergrund mit Beachtung des Pfades

Hallo Community,

ich habe ein Problem bei dem ich leider absolut nicht weiter komme.

Ich will von meinem Programm ein Explorer-Fenster öffnen. Wenn dieser Pfad noch nicht in einem Fenster geöffnet ist, erstelle ich einen neuen Process. Das funktioniert auch soweit.


internal bool ExplorerfensterÖffnen(string pfad)
        {
            try
            {
                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;
                    }
                    if (folderPath.Length > 0)
                    {
                        folderPath = folderPath.Substring(8);
                        folderPath = folderPath.Replace("/", "\\");
                        folderPath = folderPath.Replace("%20", " ");
                    }
                    if (folderPath == pfad)
                    {
                        string result = new DirectoryInfo(folderPath).Name;
                        IntPtr windowPtr = FindWindowByCaption(IntPtr.Zero, result);
                        if (windowPtr == IntPtr.Zero)
                        {
                            // Fenster ist nicht vorhanden, neues Fenster im Explorer öffnen
                            Process.Start("explorer.exe", pfad);
                            return true;
                        }
                        else
                        {
                            // Fenster ist vorhanden, und wird in den Vordergrund geholt
                            IntPtr handle = windowPtr;
                            if (IsIconic(handle))
                            {
                                ShowWindow(handle, SW_RESTORE);
                            }

                            SetForegroundWindow(handle);
                            return true;
                        }

                    }
                }
            }
            catch 
            {
                return false;
            }
            // Kein Fenster geöffnet
            Process.Start("explorer.exe", pfad);
            return true;
        }

Jetzt zu meinem Problem:
Durch unterschiedliche Laufwerke (Lokal, Netzlaufwerk) und unterschiedliche Ordnerstrukturen (Ordner1\Ordner2 und Ordner3\Ordner2) wird immer das erste Fenster mit "Ordner2" in den Vordergrund geholt. Die Suche berücksichtigt nicht den gesamten Pfad, was allerdings in diesem Fall nötig wäre.

Ich hoffe ich habe mich verständlich ausgedrückt. Für Tipps, wie ich das lösen kann, bin ich sehr dankbar.

Grüße Stoffel

4.938 Beiträge seit 2008
vor einem Jahr

Es sollte reichen, wenn du einfach nur Process.Start(path) aufrufst. Wenn das Windows Explorer Fenster noch nicht existiert, wird es neu erzeugt, andernfalls einfach zum bestehenden Fenster gewechselt (m.E. kann damit dein gesamter Code entfallen - bes. der Zugriff mittels veralteter Internet Explorer Komponente).

16.828 Beiträge seit 2008
vor einem Jahr

Punkt 1: Deutsche Bezeichner an sich ist ja schon ein Verbrechen, aber auch noch Umlaute zu verwenden sollte eine Straftat sein 😉

Punkt 2: Was ist Denn Deine Frage? Wo kommst Du nicht weiter?
Wie man die Suche ändert, oder was ist das Problem? Ich seh auch keine "Suche" wie Du sie ausdrückst.

Wenns an der Handhabung von Ordner1\Ordner2 und Ordner3\Ordner2 liegt, dann änder das doch? Wird ja vermutlich der Code 18-20 sein.

S
Stoffel000 Themenstarter:in
11 Beiträge seit 2021
vor einem Jahr

Danke, danke, danke!!

@Th69: Ich habe viel zu kompliziert gedacht. Deine Lösung funktioniert einwandfrei!

@Abt: zu Punkt 1: Da hast du wirklich recht. Ich arbeite ein altes Programm auf, bei dem leider solche Dinge noch vorhanden sind. Wird aber noch geändert 😉

zu Punkt 2: Ich habe viel zu kompliziert gedacht. Die Lösung von Th69 war für mich die richtige. Ich hatte das Problem, durch das starten des Prozesses mit


Process.Start("explorer.exe", pfad);

wurde immer eine neue Instanz des Explorers geöffnet (ist ja auch klar). Somit hatte mein Programm bei jedem Aufruf eine neu Instanz geöffnet. Wenn diese der Benutzer nicht geschlossen hat, waren es mehrere Instanzen mit dem gleichen Pfad. Das wollte ich vermeiden.

Ich habe es jetzt so gelöst:


internal bool OpenExplorer(string path)
        {
            try
            {
                Process.Start(path);
            }
            catch(Exception e)
            {
                MessageBox.Show($"Folgender Fehler wurde erzeugt:\n{e}", "Fehler beim Öffnen des Ordners", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            return true;
        }

Somit ist auch Punkt1 erledigt 😉