Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Explorerfenster in den Vordergrund mit Beachtung des Pfades
Stoffel000
myCSharp.de - Member



Dabei seit:
Beiträge: 9

Themenstarter:

Explorerfenster in den Vordergrund mit Beachtung des Pfades

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.487

beantworten | zitieren | melden

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).
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.183

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Stoffel000
myCSharp.de - Member



Dabei seit:
Beiträge: 9

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers