- Offizieller Beitrag
Vorab:
Das ist hier keine superelegante Lösung mit Zugriff auf DOM, sondern eher ein Workaround um auch ohne IE-Objekt Html in eigene GUI einbetten zu können.
Ich weiß auch nicht, ob sich Opera überhaupt anzapfen lässt, um direkt mit dem Objekt zu interagieren. Ich gehe hier einfach den Weg: Html-Datei im Temp-Ordner erstellen und als Parameter an den Opera-Aufruf anhängen. Das Opera-Fenster greife ich mir dann und hänge es als Child in eine eigene GUI.
Einen Handling-Nachteil haben wir allerdings: Ich kann zwar in meiner angezeigten Html-Datei Referenzen auf Online-Seiten einfügen und dann in der Anwendung diese auch anzeigen - ABER: Ich komme nicht mehr zurück, da ich keine Navigationsmöglichkeit habe, ich kann immer nur eine neue Html-Datei erstellen und das Fenster Refreshen, um diese zu laden. Referenzen auf Textmarken funktionieren aber tadellos. Diese UDF ist gedacht um lokale Html-Dateien/Inhalte in eine GUI einzubetten.
Opera habe ich verwendet, weil dieser Browser nach allem, was ich bisher gesehen habe, der einzige ist, der sich soweit personalisieren lässt (optisch), dass nur das nackte Fenster ohne Menüs, Bars, Statuszeile übrig bleibt. Die verwendete portable Version 12.18 ist mit ca. 30 MB auch eine der kleinsten von allen portablen Browsern. (Portabel deshalb, damit man diesen auch bei Projekten mitgeben kann). Wenn ihr den Browser selber laden möchtet: Opera@USB für Windows v12.18. Anschließend müssen über das Konfigurationsmenü (Rechtsklick in den geöffneten Browser) alle Anzeigen für Menüs, Bars, Statuszeile deaktiviert werden.
Ich biete hier einen Gesamt-DL aller Dateien (UDF + Bsp.) mit Browser und bereits vorkonfiguriertem Profil zum DL (s. DL_embedded.zip.txt im Anhang).
Bei einzelnem Download:
In einem Ordner legt bitte folgende Struktur an
<fonts> enthält "SourceCodePro" für "array_tut.htm"
<Opera> portable Version 12.18
array_tut.htm Testdatei, verwendet in "..ExampleHelp.au3"
OperaEmbedded.au3 UDF
OperaEmbedded_ExampleHelp.au3 Beispiel
OperaEmbedded_ExampleTable.au3 Beispiel
;-- TIME_STAMP 2020-11-19 16:13:36 v 0.1
#include-once
#include <WinAPISysWin.au3>
#include <WindowsConstants.au3>
; Opera@USB für Windows v12.18
; DL: https://www.netzwelt.de/software-download/26792-opera-usb.html
; only 1 embedded window is possible
; ".\Opera\profile\operaprefs.ini" - if something fails with the view: delete the profile folder, a new one will created
; and disable all bars and menus in config menu (right click in opened opera window)
Opt('MustDeclareVars', 1)
OnAutoItExitRegister('_OperaEmbedded_Exit')
Global Const $gc_PathBrowser = @ScriptDir & '\Opera\Opera.exe'
Global $g_PathTempHtml = @TempDir & '\OperaEmbeddedTemp.html'
Global $g_hOperaEmbedded, $g_hMain, $g_PID = Null
Func _OperaEmbedded_Exit()
If $g_PID = Null Then Exit
FileDelete($g_PathTempHtml)
WinClose($g_hOperaEmbedded)
ProcessClose($g_PID)
EndFunc
; negative values (width/height) treated as: difference of client.width/height minus value
Func _OperaEmbedded_Create($_hParent, $_x, $_y, $_w=Default, $_h=Default, $_bBorder=False)
Local Static $bActive = False
If $bActive Then
Return SetError(1,0,0) ; only one instance possible
Else
$bActive = True
EndIf
$g_hMain = $_hParent
$g_PID = @AutoItPID
_OperaEmbedded_CreateHtml('', '', False) ; empty file for start
__OperaEmbedded_StartHidden()
Local $iStyle = $_bBorder ? (BitOr($WS_CHILD,$WS_BORDER)) : $WS_CHILD
_WinAPI_SetParent($g_hOperaEmbedded, $g_hMain)
; set style fails sometimes (don't know why) - do it in a loop until successfully
Do
Sleep(10)
Until _WinAPI_SetWindowLong($g_hOperaEmbedded, $GWL_STYLE, $iStyle) <> 0
_WinAPI_SetWindowLong($g_hOperaEmbedded, $GWL_EXSTYLE, $WS_EX_MDICHILD)
Local $clientWidth = _WinAPI_GetClientWidth($g_hMain)
Local $clientHeight = _WinAPI_GetClientHeight($g_hMain)
If $_w < 0 Then
$_w = $clientWidth - Abs($_w)
ElseIf $_w > $clientWidth Or $_w = Default Then
$_w = $clientWidth
EndIf
If $_h < 0 Then
$_h = $clientHeight - Abs($_h)
ElseIf $_h > $clientHeight Or $_h = Default Then
$_h = $clientHeight
EndIf
WinMove($g_hOperaEmbedded, '', $_x, $_y, $_w, $_h)
EndFunc
Func _OperaEmbedded_CreateHtml($_Body='', $_Style=-1, $_JS=-1, $_bRefresh=True)
Local Static $sStyle = '', $sJS = ''
If $_Style <> -1 Then $sStyle = $_Style
If $_JS <> -1 Then $sJS = $_JS
Local $sHtml = '<!DOCTYPE html><html>' & _
'<head><meta charset="utf-8">' & _
'<title>OperaEmbeddedWindow</title>' & _ ; title is invisible but fix for window detection
'<script language="JavaScript">' & $sJS & '</script>' & _
'<style type="text/css">' & $sStyle & '</style>' & _
'</head>' & $_Body & '</html>' & @CRLF
Local $fH = FileOpen($g_PathTempHtml, 8+2)
FileWrite($fH, $sHtml)
FileClose($fH)
If $_bRefresh Then _OperaEmbedded_RefreshView()
EndFunc
Func _OperaEmbedded_HtmlFromFile($_sFileHtml, $_aReplaces=Null)
Local $sHtml = FileRead($_sFileHtml)
$sHtml = StringRegExpReplace($sHtml, '<title>[^<]+<', '<title>OperaEmbeddedWindow<', 1)
If IsArray($_aReplaces) Then
For $i = 0 To UBound($_aReplaces) -1
$sHtml = StringReplace($sHtml, $_aReplaces[$i][0], $_aReplaces[$i][1])
Next
EndIf
Local $fH = FileOpen($g_PathTempHtml, 8+2+512) ; ANSI mode
FileWrite($fH, $sHtml)
FileClose($fH)
EndFunc
Func _OperaEmbedded_Show($_iState=@SW_SHOWNA)
_WinAPI_ShowWindow($g_hOperaEmbedded, $_iState)
EndFunc
Func _OperaEmbedded_RefreshView()
WinActivate($g_hOperaEmbedded)
WinWaitActive($g_hOperaEmbedded, 5)
Send("{F5}")
WinSetState($g_hOperaEmbedded, '', @SW_SHOWNA)
WinActivate($g_hMain)
EndFunc
Func __OperaEmbedded_StartHidden()
ShellExecute($gc_PathBrowser, $g_PathTempHtml, @TempDir, '', @SW_HIDE)
Local $optOld = Opt('WinTitleMatchMode', 2)
$g_hOperaEmbedded = WinWait('OperaEmbeddedWindow')
Opt('WinTitleMatchMode', $optOld)
EndFunc
Alles anzeigen
Eine Html-Datei kann man natürlich mit: ShellExecute(PathBrowser, @ScriptDir & "\meineDatei.html") ausführen. Jedoch dann mit Titel und Icon des Browserfensters.
Ich verwende hier zum Aktualisieren der Inhalte, mangels anderer Techniken, das Senden von F5. Falls jemand einen eleganteren Weg kennt, immer her damit.