embedded Windows-Explorer unter Windows 7 ohne Adress-/Navigations-/Vorschauleiste

  • nach zahlreichen Versuchen und Fehlschlägen wende ich mich wieder an die Community in der Hoffnung, weiter zu kommen.

    Ich möchte eine größenveränderliche GUI erstellen, in welcher ich einen Windows-Explorer einbetten möchte.
    Der Benutzer soll die Möglichkeit haben, Dateien per Windows-Drag/Drop oder Copy/Paste raus- und rein zu kopieren.
    Er soll aber nur das eigentliche Explorerfenster zu sehen bekommen, keinen Schnick-Schnack ringsrum, keine Adressleiste, keine Symbolleiste, keine Statusleiste, keine Vorschau und keine Navigationsleiste.
    Die Darstellung soll Detail-Ansicht sein. Ich kann/möchte keinerlei Windows-Einstellungen dazu verbiegen/müssen - der Aufbau des embedded-Explorers muss dies alles bewerkstelligen.

    Soweit zu meiner Idealvorstellung. Bei meinen weiteren Beschreibungen verzichte ich der Einfachheit halber auf die Größenveränderlichkeit...

    Bislang habe ich verschiedene Wege getestet:

    1. mit dem shell.explorer.2-Objekt:

    [autoit]


    $object = ObjCreate("Shell.Explorer.2")
    $GUI_ActiveX = GUICtrlCreateObj ($object, 10, 10, 300, 400)
    $object.navigate("\\Server\Freigabe\Ordner")

    [/autoit]


    Dies macht genau meine Ansicht die ich benötige. Problem hier speziell unter Windows 7: Drag/Drop auf eine Datei klappt nicht, bei Rechte Maustaste-Kopieren hängt sich die GUI auf, bei Klicken auf einen Ordner geht immer ein neues Windows-Explorerfenster außerhalb der GUI auf.
    Das Problem hier scheint mir, das shell.explorer.2-Objekt ist ein Internet-Explorer-Objekt, welcher im Windows 7 keine Windows-Explorer-Darstellung mehr übernimmt, sondern dies dem Windows-Explorer übergibt, welcher in einem separatem Fenster startet. Dies kann man prima nachstellen, wenn man im Internet-Explorer C:\ eingibt, dann startet ein neues separates Windows-Explorer-Fenster. Dieser Weg wird also meiner Einschätzung nach im Windows 7 nicht mehr gehen. Oder kennt da jemand einen Ausweg?

    Ein richtiges Windows-Explorer-Objekt mit IDispatch scheint es im Windows 7 nicht zu geben - ich kenn bislang nur shell.explorer oder Internet.Application oder so ähnlich...

    2. mit dem explorer.exe-Prozess:

    [autoit]


    Run('explorer.exe /n, \\Server\Freigabe\Ordner', "", @SW_HIDE)
    WinWait("[CLASS:CabinetWClass]")
    $hExplorer = WinGetHandle("[CLASS:CabinetWClass]")
    _WinAPI_SetParent($hExplorer, $MaskeChildWin); Explorer als embedded-Objekt setzen
    WinMove($hExplorer, "", 10, 10, 300, 400)
    _WinAPI_SetWindowLong($hExplorer, $GWL_STYLE, 0x06800000); damit wird der Rahmen entfernt incl. Close- und Minimier-Button
    WinSetState($hExplorer, "", @SW_SHOW)
    $hList = ControlGetHandle ($hExplorer, "", "[CLASS:DirectUIHWND; INSTANCE:3]"); komischerweise ist es bei Windows 7 nicht "[CLASS:SysListView32; INSTANCE:1]"
    $ausgabe = ControlListView ($hExplorer, "", $hList, "ViewChange", "details"); Auf Detail-Ansicht umschalten
    ;jetzt aus dem Handle das Objekt ermitteln
    $o_Shell = ObjCreate("Shell.Application")
    $o_ShellWindows = $o_Shell.Windows(); collection of all ShellWindows (IE and File Explorer)
    For $o_window In $o_ShellWindows
    If $o_window.LocationURL = "file:" & StringReplace($folder, "\", "/") Then
    $hExplorerobj = $o_window
    ExitLoop
    EndIf
    Next

    [/autoit][autoit][/autoit][autoit]

    ;Hier noch erste fehlerhafte Ideen, die Navigationsleiste weg zu bekommen (die links neben der File-Ordner-Ansicht im W7 steht)
    $objPane = $hExplorerobj.LocationURL
    $o_Shell = ObjCreate("Application.ActiveExplorer")
    $objPane = $o_Shell.NavigationPane
    $objPane.IsCollapsed = True

    [/autoit]

    Kann mir bitte jemand weiterhelfen, wie ich ein eingebettetes Windows-Explorer-Fenster ohne jeglichen Schnick-Schnack in meine GUI bekomme?

  • Hat keiner eine Idee, wie ich der explorer.exe Befehle senden kann, die z.B. die Adress-Leiste ausblenden oder die Navigationsseite?
    Entweder über dllcall oder per object-Zugriff?

    Es wäre toll, wenn jemand Ansätze dafür liefern kann...

    Ein weniog weiter bin ich bereits in sofern gekommen, daß ich mittels:

    [autoit]


    ControlHide ($hExplorer, "", ControlGetHandle ($hExplorer, "", "[CLASS:SysTreeView32; INSTANCE:1]")); Navigationsleiste
    ControlHide ($hExplorer, "", ControlGetHandle ($hExplorer, "", "[CLASS:Search Box; INSTANCE:1]")) ; Suchfeld
    ControlHide ($hExplorer, "", ControlGetHandle ($hExplorer, "", "[CLASS:Address Band Root; INSTANCE:1]")); Adressleiste
    ControlHide ($hExplorer, "", ControlGetHandle ($hExplorer, "", "[CLASS:ReBarWindow32; INSTANCE:2]")); Menüleiste

    [/autoit]


    die benötigten Leisten abschalten kann.
    Das ganze vor

    [autoit]

    WinSetState($hExplorer, "", @SW_SHOW)

    [/autoit]


    macht den Explorer direkt mit abgeschaltenen Leisten sichtbar - ich hab sogar noch die Vorwärts-Rückwärts-Leiste sichtbar - die müsste ich sonst extra programmieren.

    Jetzt stört nur noch, das die Navigationsleiste zwar weiß - also versteckt ist, aber die weiße Fläche eben immer noch sichtbar ist.
    Und ich möchte gerne die Leiste oben, wo z.B. CD-Brennen, Organisieren etc. steht und die Statusleiste unten noch weg haben - da find ich aber keine CLASS-INSTANCE-Werte.
    Wie bekomm ich die Leisten auch noch weg?

    2 Mal editiert, zuletzt von card0384 (19. Januar 2011 um 14:58)

  • Hallo card0384,

    ich habe WinXP SP3 und da ist beim embedded IE keine Adressleiste eingeblendet. Teste einfach einmal meinen Internetbrowser mit Ladebalken (Link siehe Signatur)

    mfg autoBert

  • Hi autoBert,

    danke für deine Hilfe. Leider klappt dies ab Windows 7 nicht mehr so. da tritt genau der Effekt ein, den ich bei der shell.explorer.2-Methode erwähnte.
    -Ich geb in dein Beispiel oben ein: \\Server\Freigabe\Ordner und drück auf GO
    -Der Browser zeigt die Freigabe an - die Optik ist genau, wie von mir gewünscht - ohne jeden Schnick-Schnack
    -Sobald ich einen Ordner anklicke, öffnet sich ein separates Explorer-Fenster außerhalb der GUI mit dem Inhalt.
    -Drag&Drop klappt nicht.
    -usw...

    Daher bin ich ja auf der Suche nach einer neuen Variante...
    Hast du noch andere Ideen?
    Ich glaube, ich muss mittels ControlCommand ( "title", "text", controlID, "command" [, "option"] )
    und (Auszug aus der Hilfe)
    "SendCommandID", Command ID - Simulates the WM_COMMAND message. Usually used for ToolbarWindow32 controls - use the ToolBar tab of Au3Info to get the Command ID.
    ein WM_COMMAND an das Explorer-Fenster senden, was nichts anderes macht wie im Explorer auf "Organisieren" -> "Layout" -> "Navigationsbereich" virtuell zu klicken und damit den Navigationsbereich auszublenden.
    Hier steht was dazu -> MSDN

    Mit

    [autoit]

    ControlGetHandle ($hExplorer, "", "[CLASS:DirectUIHWND; INSTANCE:2]")

    [/autoit]

    bekomm ich das Handle des Hauptfensters - also ohne Adressleiste aber incl. Navigations-, Vorschau- und Statusleiste. Dem Handle muss ich mittels einer Message (event. DLLCall) begreifbar machen, die ganzen Leisten auszublenden.

    Aber wie?

    2 Mal editiert, zuletzt von card0384 (19. Januar 2011 um 15:33)

  • Ich möcht nochmals fragen, ob es keinen Profi hier gibt, der sich dermaßen mit DLL-Calls auskennt, um mir hier ein Beispiel zu geben, mittels dem ich die Leisten ausblenden kann?

  • Hi Sprenger,

    nein ich probiers mit nem 32-Bit-W7
    Hättest du ein wenig Quellcode für dein funktionierendes Bsp.?
    Eventuell machst du was anders wie ich...
    Vor Windows7 klappt bei mir auch die Geschichte, nur im W7 nicht mehr...

  • Hi,
    hier is mein Testcode.

    [autoit]

    GUICreate("",700,700)
    GUISetState()
    $object = ObjCreate("Shell.Explorer.2")
    $GUI_ActiveX = GUICtrlCreateObj($object, 10, 10, 300, 400)
    $object.navigate("C:\")

    [/autoit][autoit][/autoit][autoit]

    While GUIGetMsg() <> -3
    WEnd

    [/autoit]

    //Edit: Habs gerade mal mit ner Freigabe getestet. Funktioniert auch aber es wird nur ein Warndialog angezeigt
    autoit.de/wcf/attachment/12489/
    und danach macht es was es soll ;)

  • Hi Sprenger,

    dein Code liefert wirklich ein funktionierendes Kontext-Menü, ich hatter derlei Codezeilen auch schon getestet - wahrscheinlich wird sich mein Kontext-Menü aufgrund anderer Codezeilen aufhängen - es ist gut zu wissen, daß es generell erstmal klappt.
    Das zweite Problem ist aber dennoch gegeben - shell.explorer.2 ist ein Ableger des Internet-Explorers - was bedeutet, W7 übergibt alle Ordneraktionen an den Windows-Explorer, also es geht ein separates Fenster auf, sobald man einen Ordner anklickt - wie auch Magnus schon bemerkte.
    Wenn ich darüber nachdenke, hier ein Kontext-Menü jetzt lauffähig zu haben (meine anderen Codezeilen kann ich ja rausfiltern, die das Aufhängen verursachen), gibt es eine Möglichkeit das Klicken eines Ordners abzufangen, bevor die Übergabe an den Windows-Explorer stattfindet und mittels dem

    [autoit]

    $object.navigate("Klick-Ordner")

    [/autoit]


    den shell.explorer.2 zum Navigieren zu bewegen?
    Dann wäre alles optimal...

    PS: das mit der Freigabe-Sicherheitsabfrage geht auch weg, wenn du die IP-Adresse (oder DNS-Adresse) deiner Freigabe im Internet-Explorer -> Extras -> Internetoptionen -> Registerkarte Sicherheit -> Lokales Intranet -> Button Sites -> Erweitert -> ohne Serverüberprüfung hinzufügst.
    shell.explorer.2 ist eben eine Internet-Explorer-Application, daher will sie auch entsprechend bedient werden...

    3 Mal editiert, zuletzt von card0384 (4. Februar 2011 um 11:36)