Browser als eingebettetes Object möglich

  • Ist es möglich, einen installierten (ggf. auch portablen) Firefox (optional auch Chrome) als eingebettetes Object in einer eigenen AutoIt-GUI mit einer lokalen Datei zu öffnen ? IE ist hier nicht die Frage...

    Eine parallel laufende Browsersitzung sollte dabei nicht verändert werden.

    Ein neues Fenster lässt sich ja mit "Firefox.exe -new-windows C:\preview.html" starten. Ich würde dieses Fenster aber gerne in einer AutoIt-Oberfläche anzeigen.

    P.S: Hintergrund ist der Aufruf als Preview aus einer Entwicklungsumgebung heraus.

    Bin für Tips dankbar...

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    2 Mal editiert, zuletzt von Micha_he (5. Februar 2015 um 17:12)

  • Aber natürlich habe ich mir die Funktionen der 'FF.au3' angesehen. Nur hilft mir keine beim eigentlichen Problem, das Fenster in die GUI zu bekommen oder gleich darin zu öffnen.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Du könntest theoretisch auf die grundlegenden Win32-Methoden zurückgreifen, sogar ganz ohne FF.au3... Das passende Stichwort ist hier die Funktion SetParent, weitere Informationen findest du im MSDN. Es gibt sogar eine AutoIt-Umsetzung aus der WinAPI.au3: _WinAPI_SetParent. Wie der Name schon andeutet, kannst du damit das Elternfenster (Parent Window) eines beliebigen Fensters (Child Window) festlegen. Dann musst du nur noch die Styles des Fenster richtig anpassen, WS_POPUP sowie WS_CHILD würden sich bspw. anbieten. Die Funktion _WinAPI_SetWindowLong mit dem Parameter GWL_STYLE hilft hier weiter. Dann ist ggf. noch eine Positionsänderung des neuen Child Window nötig. Du kannst dich ja mal an diesem Beispiel von der Integration von notepad.exe orientieren:

    Spoiler anzeigen
    [autoit]


    #include <WindowsConstants.au3>
    #include <Constants.au3>
    #include <WinAPI.au3>

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

    $hParent = GUICreate("_WinAPI_SetParent", 320, 240, Default, Default, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_CLIPCHILDREN))
    GUISetState()

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

    $iPID = Run("notepad.exe", "", @SW_HIDE)
    WinWait("[CLASS:Notepad]")
    $hChild = WinGetHandle("[CLASS:Notepad]")

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

    _WinAPI_SetParent($hChild, $hParent)
    _WinAPI_SetWindowLong($hChild, $GWL_STYLE, BitOR($WS_CHILD, $WS_BORDER, $WS_POPUP))

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

    WinMove($hChild, "", 0, 0) ; an 0,0 des Hauptfensters schieben
    WinSetState($hChild, "", @SW_SHOW)

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

    Do
    ;nop
    Until GUIGetMsg() = -3 ;GUI_EVENT_CLOSE

    [/autoit]


    (Abgeändertes Beispiel, Originalquelle ist leider verloren gegangen...)

  • Das mit dem _WinAPI_SetParent funktioniert zwar mit dem Notepad im Beispiel, aber FireFox stürz dabei ab.
    Darauf basiert aber leider der Hinweis von Chip auch...

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Dann nehmen wir eben Chrome. :D

    Spoiler anzeigen
    [autoit]


    #include <WindowsConstants.au3>
    #include <Constants.au3>
    #include <WinAPI.au3>

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

    $hParent = GUICreate("_WinAPI_SetParent", 360, 280, Default, Default, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_CLIPCHILDREN))
    GUISetState()

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

    ChromeCreateEmbedded("autoit.de", 20, 20, 320, 240, $hParent)

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

    Do
    ;nop
    Until GUIGetMsg() = -3 ;GUI_EVENT_CLOSE

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

    Func ChromeCreateEmbedded($sURL, $iX, $iY, $iWidth, $iHeight, $hParent, $iWindowFindTimeout = 1000)
    $sChromeExecutable = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe", "")
    If @error Then Return SetError(1) ;chrome not installed
    $iPID = Run(StringFormat('"%s" "%s"', $sChromeExecutable, $sURL), "", @SW_HIDE)

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

    $hChrome = Null
    $hTimer = TimerInit()
    While True
    $aWindows = _WinAPI_EnumWindows()
    For $i = 1 To $aWindows[0][0]
    If $aWindows[$i][1] <> "Chrome_WidgetWin_1" Then ContinueLoop
    ;maybe it is our window?
    If $iPID = WinGetProcess($aWindows[$i][0]) Then
    $hChrome = $aWindows[$i][0]
    ExitLoop 2
    EndIf
    Next
    If TimerDiff($hTimer) > $iWindowFindTimeout Then Return SetError(2)
    If $hChrome = Null Then ContinueLoop
    WEnd

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

    $hChild = GUICreate("", $iWidth, $iHeight, $iX, $iY, $WS_CHILD, -1, $hParent)
    GUISetState()
    GUISwitch($hParent) ;switching autoit-interna back

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

    _WinAPI_SetParent($hChrome, $hChild)

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

    WinMove($hChrome, "", -8, -100 - 5, $iWidth + 16, $iHeight + 100 + 14) ; Korrekturfaktoren
    EndFunc ;==>ChromeCreateEmbedded

    [/autoit]


    Das ist allerdings nicht sehr professionel. Damit man die Ränder des Browser nicht sieht, habe ich ihn einfach so geschoben, dass die Ränder verdeckt werden. Das ganze dann noch auf eine Child-GUI damit man frei damit arbeiten kann... Und voilá!
    In welchem Maß willst du diese Technik denn einsetzen? Geht es um ein Privatprojekt oder hast du was größeres, evtl. sogar kommerzielles? Wenn es sich nur um ein Privatprojekt handelt, ist das hier wahrscheinlich ausreichend. Wenn das allerdings nicht der Fall ist, würde ich an deiner Stelle ernsthaft überlegen, ob es sich vielleicht lohnen würde, ein AutoIt-Binding für eine Rendering Engine nach Wahl zu schreiben, Gecko und Webkit z.B. sind ja OpenSource.

    Gruß

  • Nein, ist nur privat/nicht kommerziell. Ich schau mir Dein Beispiel nachher mal an...

    Teste gerade noch mit dem FF-Parameter '-chrome' der mir ein Fenster ohne Menue u.ä. erzeugt. Nur mit der Größe haut das noch nicht hin.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • @Micha
    Gut, dann kann man unter Umständen mit der Schiebe-Lösung arbeiten, wenn sonst keine Möglichkeit mit annehmbarem Aufwand-Nutzen-Verhältnis existiert.
    Ich dachte, Firefox schmiert ab? Oder hast du das Fenster nicht so eingebettet?

    @Teare
    Ja, mag sein. Ich bin Firefox-Nutzer, daher hatte ich nebenbei kein "Standalone"-Chrome offen. Das ist ja auch eher ein Proof of Concept. ^^

  • Nein, eingebettet ging in meinen Test's (mit dem FF) gar nicht. Gleich, mit welchen Parametern gestartet.

    Außerdem hat die Nutzung eines (installierten) FF mit dem gleichen Profil das Problem, das u.U. die neue Position/Größe beim Schließen in die Konfig übernommen wird.

    Ich glaube das wird alles nichts praktikables/einfaches mit dem FF. Versuche es nun einfach ohne die Einbettung in eine AutoIt-Oberfläche...

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Eine Sache habe ich noch gefunden. Irgendein Mensch mit viel Langeweile hat mal ein Gecko-ActiveX-Control geschrieben, dass allerdings seit längerem nicht mehr weiterentwickelt wird (Aktueller Gecko-Stand: Mozilla 1.7.12 :D). Wenn die Seite nicht zu aufwändig ist, dann sollte das damit gehen. Grundlegendes HTML, JavaScript und CSS sind jedenfall möglich. Nach der Installation (siehe Link oben) kannst du dieses Skript hier zum Testen benutzen:

    Spoiler anzeigen
    [autoit]


    GUICreate("Embedded Mozilla 1.7.12", 640, 580)
    Local $oFF = _FFCreateEmbedded()
    GUICtrlCreateObj($oFF, 0, 0, 640, 580)
    $oFF.Navigate("http://whatsmyuseragent.com/")
    GUISetState()

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

    While True
    Switch GUIGetMsg()
    Case -3
    Exit
    EndSwitch
    WEnd

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

    Func _FFCreateEmbedded()
    $sCLSID = "{1339B54C-3453-11D2-93B9-000000000000}"
    Local $oObject = ObjCreate($sCLSID)
    Return $oObject
    EndFunc ;==>_FFCreateEmbedded

    [/autoit]