Senden von Text in Windows Explorer-Leiste mit anschließendem ENTER

  • Hallo Leute,
    ich befasse mich erst seit kurzem mit AutoIT, ich hatte es schon länger vor, da es bei Windows immer wieder einige Stellen zu "flicken" gibt. ;)
    Immer wieder mache ich die Erfahrung, dass auch bei bereits verbundenen Netzlaufwerken (bspw. durch Script oder bei Windows gespeichert), erst der Mausklick oder das Aufrufen des zugewiesenen Netzlaufwerkbuchstabens im Windows Explorer bei angelegten Verknüpfungen keine Probleme mehr bereitet. Dies zum Hintergrund.

    Leider funktioniert mein Script noch nicht vollständig:
    Run("explorer.exe")
    "WinWaitActive[CLASS:DirectUIHWND;INSTANCE:3]"
    ControlSend("", "", "[CLASS:ToolbarWindow32; INSTANCE:2]", "X:")

    Das Explorer-Fenster wird geöffnet, es gibt auch keine Fehlermeldung mehr, aber weiter geschieht nichts, d. h., dass der Text "X:" wird nicht in die obere Explorer-Adressleiste eingefügt.

    Habe in der Online AutoIT-Referenz und im Forums-Archiv bisher keine Lösungen gefunden.

    Danke, auTomate

  • @Oscar
    Danke für deine Antwort. Ja, deine Vermutung war gar nicht so falsch, ich habe deshalb eigentlich auch vorsorglich den Hintergrund meiner Frage in meinem Post erwähnt:
    "Immer wieder mache ich die Erfahrung in, dass auch bei bereits verbundenen Netzlaufwerken (bspw. durch Script oder bei Windows gespeichert), erst der Mausklick oder das Aufrufen des zugewiesenen Netzlaufwerkbuchstabens im Windows Explorer bei angelegten Verknüpfungen keine Probleme mehr bereitet."
    Vielleicht war es nicht ganz verständlich ausgedrückt. Beim Einsatz von Netzlaufwerken hilft manchmal nur ein (Doppel)klick in der Explorer-GUI auf dieses Laufwerk, damit das rote Kreuz verschwindet und Verknüpfungen mit einem Netzlaufwerk-Pfad auch ohne Fehlermeldung ("xyz wurde nicht gefunden") geöffnet werden können.
    Allerdings war dies auch endlich ein konkreter Anlass, mich mit AutoIT zu beschäftigen. ;)

    @Photon
    You make my day! Danke für deine Antwort, dieser Ansatz lässt sich mit einer einzigen Batch-Zeile realisieren:
    %windir%\explorer /e,[Laufwerksbuchstabe]:

    Shame on me, ich habe diesen Parameter sogar früher eingesetzt, aber in diesem Zusammenhang bin ich einfach nicht darauf gekommen.

    Mal sehen, ob ich das Explorer-Fenster wieder schließen kann, werde also doch AutoIT einsetzen. :thumbup:

    MfG, auTomate

  • Falls mal jemand die Klick-Variante braucht... wenn ein bereits geöffnetes Explorer-Fenster verwendet werden soll. ;)

    Bei mir (Win10) ist Instance = 3

    "WinWaitActive[CLASS:DirectUIHWND;INSTANCE:3]" ist eh schon mal total falsch...
    .
    Richtig wäre:

    Local $hWnd = WinWaitActive('[CLASS:CabinetWClass]', '', 3) ; 3 sec warten

    EXPLORER_CLASS_INSTANCES_WIN_10.pngWindow_CLASS_INSTANCE.png

    18 Mal editiert, zuletzt von Bitnugger (24. Juli 2016 um 07:00)

  • Hallo Bitnugger,

    danke, dass du dir soviel Arbeit gemacht hast, aber so tief wollte ich gar nicht einsteigen in die Programmierung/Scripting mit AutoIT. Da könnte ich ja gleich mit C++ anfangen ;)

    ""WinWaitActive[CLASS:DirectUIHWND;INSTANCE:3]" ist eh schon mal total falsch..."
    Mehr hat mir das Tool "Window Info" nicht verraten, weiß nicht was du da benutzt, um an
    "[CLASS:CabinetWClass; INSTANCE:1]"
    zu gelangen. In C++ scheint es jedenfalls die Funktion EnumWindows zu geben.

    Ist auf jeden Fall ein Treffer, denn damit kann ich jetzt tatsächlich das Explorer-Fenster wieder schließen. WinWaitActive ist mir hier bei der Nicht-Klick-Variante weniger nützlich, denn damit wird nur auf das Fenster gewartet (und das erscheint bei mir rasend schnell) und nicht, bis der Inhalt des Netzlaufwerks auf der GUI erscheint (das ist hier das Entscheidende). Ich nehme dann erst einmal "Sleep" und werde sehen, ob das ausreicht, denn "explorer /e,X:" scheint zuverlässig "einzuschlagen" bei Windows, wenn die automatische Netzlaufwerkverbindung vorher eingerichtet wurde.

    Deshalb nun hier mein simples (und erstes) Script:
    Run("explorer.exe /e,X:")
    Sleep(6000)
    WinClose('[CLASS:CabinetWClass; INSTANCE:1]')

    Mit dem beigelieferten Compiler hat es alles problemlos geklappt, also noch einmal Daumen hoch für AutoIT. :thumbup:

    Grüße, auTomate

  • ""WinWaitActive[CLASS:DirectUIHWND;INSTANCE:3]" ist eh schon mal total falsch..."
    Mehr hat mir das Tool "Window Info" nicht verraten, weiß nicht was du da benutzt, um an
    "[CLASS:CabinetWClass; INSTANCE:1]"
    zu gelangen. In C++ scheint es jedenfalls die Funktion EnumWindows zu geben.

    ""WinWaitActive[CLASS:DirectUIHWND;INSTANCE:3]" --> WinWaitActive("[CLASS:DirectUIHWND; INSTANCE:3]", "", 3) ; 3 sec warten - und nicht bis in alle Ewigkeit!

    WinWaitActive greift zudem auch nicht bei DirectUIHWND, weil DirectUIHWND nicht die Klasse eines 'echtes Window', sondern die eines Controls ist - dass, in dem die Dateiliste angezeigt wird.
    DirectUIHWND wird dir im AutoIt Info-Tool aber auch unter "Basic Control Info" angezeigt! ;)


    Für Controls liefern uns die Funktionen ControlFocus() und ControlGetFocus() die gewünschten Infos.

    ControlFocus() und ControlGetFocus()


    In AutoIT gibt es die Funktion _WinAPI_EnumWindows()

    _WinAPI_EnumWindows()


    AutoIt
    #include <WinAPI.au3>
    Local $sDrive = 'C:'
    Run('explorer.exe /e,' & $sDrive)
    ; hier merken wir uns die zuletzt geöffnete (unsere) Instanz des Explorers
    Local $aExplorer = _WinAPI_EnumWindows('[CLASS:CabinetWClass]')		; CabinetWClass    --> dem AutoIt Info-Tool entnommen (Basic Window Info)
    Local $iLastInstace = UBound($aExplorer)				; Handle/Classname --> stehen hier in der Reihenfolge, in der sie geöffnet wurden
    Run('explorer.exe /e,' & $sDrive & '\Windows') ; anderen Pfad angeben, damit ein neues Explorer-Fenster geöffnet wird
    WinClose('[CLASS:CabinetWClass; INSTANCE:' & $iLastInstace & ']')	; die (von uns) zuletzt geöffnete Instanz des Explorers killen - und nicht irgendeine!

    EnumWindows.png

    4 Mal editiert, zuletzt von Bitnugger (25. Juli 2016 um 23:00)