Explorer Starten mit Dieser PC

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    Da es leider keinen Environment.SpecialFolder Eintrag dafür gibt(Ab Windows 7 jedenfalls nicht mehr. Davor könnte MyComputer funktionieren), bleibt einem wohl nur noch diese Möglichkeit:
    Process.Start("::{20d04fe0-3aea-1069-a2d8-08002b30309d}")
    stackoverflow.com/questions/10…y-computer-folders-from-c

    Nicht vergessen das für dein zukünfties Ich und alle die diesen Code eines Tages sehen zu erklären.
    Bei mir geht's mit Process.Start("explorer.exe", ",")
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Toolmaster schrieb:

    Dieser PC war ja jetzt nur ein Beispiel.
    Poste bitte die vollständige und belastbare Aufgabenstellung / Problembeschreibung!
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also mit folgendem Code lese ich den Inhallt der Adressleiste des Explorers aus.

    Quellcode

    1. Private Const WM_GETTEXT As Integer = &HD
    2. Private Const WM_GETTEXTLENGTH As Integer = &HE
    3. <DllImport("user32.dll", EntryPoint:="FindWindowExW")>
    4. Public Function FindWindowExW(ByVal hwndParent As System.IntPtr, ByVal hwndChildAfter As System.IntPtr, <InAttribute(), MarshalAs(UnmanagedType.LPTStr)> ByVal lpszClass As String, <InAttribute(), MarshalAs(UnmanagedType.LPTStr)> ByVal lpszWindow As String) As System.IntPtr
    5. End Function
    6. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    7. Public Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As Integer, ByVal lParam As StringBuilder) As Integer
    8. End Function
    9. Public ListOfPaths As New List(Of String)
    10. Public Sub GetOpenedFolder() 'Speichert die aktuell geöffneten Ordner
    11. Dim hWinList As New List(Of IntPtr)
    12. Dim hWnd As IntPtr = FindWindowExW(IntPtr.Zero, IntPtr.Zero, "CabinetWClass", Nothing)
    13. While Not hWnd.Equals(IntPtr.Zero)
    14. hWinList.Add(hWnd)
    15. hWnd = FindWindowExW(IntPtr.Zero, hWnd, "CabinetWClass", Nothing)
    16. End While
    17. If hWinList.Count > 0 Then
    18. For Each hChld As IntPtr In hWinList
    19. Dim hChild1 As IntPtr = FindWindowExW(hChld, IntPtr.Zero, "WorkerW", Nothing)
    20. Dim hChild2 As IntPtr = FindWindowExW(hChild1, IntPtr.Zero, "ReBarWindow32", Nothing)
    21. Dim hChild3 As IntPtr = FindWindowExW(hChild2, IntPtr.Zero, "Address Band Root", Nothing)
    22. Dim hChild4 As IntPtr = FindWindowExW(hChild3, IntPtr.Zero, "msctls_progress32", Nothing)
    23. Dim hChild5 As IntPtr = FindWindowExW(hChild4, IntPtr.Zero, "Breadcrumb Parent", Nothing)
    24. Dim hChild6 As IntPtr = FindWindowExW(hChild5, IntPtr.Zero, "ToolbarWindow32", Nothing)
    25. Dim len As Integer = SendMessage(hChild6, WM_GETTEXTLENGTH, 0, Nothing)
    26. Dim sb As New StringBuilder(len + 1)
    27. SendMessage(hChild6, WM_GETTEXT, len + 1, sb)
    28. Dim ExplorerPath As String = sb.ToString.Substring(sb.ToString.IndexOf(":") + 1).Trim
    29. ListOfPaths.Add(sb.ToString)
    30. Next
    31. End If
    32. End Sub


    Jetzt habe ich in der ListofPaths alle geöffneten Ordner. Nur ist Die Anzeige Leider auch so.

    Quellcode

    1. Netzwerk
    2. Dieser PC


    Jetzt wird der Explorer beendet und soll mit den vorher geöffneten Ordnern wiederhergestellt werden.

    Grüße Toolmaster

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Toolmaster“ ()

    @Toolmaster Dann musst Du genau diese Strings erkennen und beim Wiederherstellen gesondert behandeln.
    Wie, steht oben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Toolmaster schrieb:

    Das ist nicht so toll.
    Dass ist ne Fleißarbeit.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    So habe jetzt (fast) einen Weg gefunden wie ich das hinbekomme.
    Funktioniert auch soweit, nur bekomme ich manchmal den Fehler das,das Interface unbekannt ist. Und das auch eigentlich nur beim Netzwerk Ordner. Aber wie gesagt nicht immer. Vieleicht kann sich ja wer den Code asehen und helfen diesen Fehler auszumerzen.
    Dateien
    • NTKrnel.zip

      (635,4 kB, 89 mal heruntergeladen, zuletzt: )
    @Toolmaster Was muss ich tun, um Deinen Effekt zu reproduzieren?
    ====
    Was genau soll Dein Programm machen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Toolmaster schrieb:

    kann ich die Ordner wie sie Waren wiederherstellen.
    bedeutet genau was?
    Welche Fenster werden gelistet?
    Welche nicht?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Der Windows-Explorer ist eine Ansicht, die verschiedene Objekte aus dem Windows Shell-Namespace als Fenster darstellt. Jedes Objekt ist durch seinen pIDL eindeutig identifiziert, siehe dazu docs.microsoft.com/en-us/windo…top/shell/namespace-intro.

    Ich würde daher von jedem geöffneten Fenster den pIDL ermitteln und speichern. Daraus kannst du die Objekte auch wieder konstruieren. Dagegen spricht der Aufwand - die Sache wird ziemlich COM-lastig und dürfte daher in C besser lösbar sein als in C#.
    Gruß
    hal2000