![]() |
AW: [NonVCL] Browser
Hallo zusammen,
Es ist lange her dieser Post, aber als ich mich heute nochmal daran gewagt habe, habe ich es hinbekommen so wie ich es wollte. Hier die gesammter Projektcode
Delphi-Quellcode:
Für meine Zwecke reicht dies soweit. Habs halt mal gepostet falls jemand das selbe vorhat.
program nonVCL;
uses SysUtils, windows, messages, classes, ActiveX, Variants, SHDocVw_TLB; //Damit keine VCL großartig benutzt wird hab ich die Klassen nochmal extra erstellen lassen also ohne VCL. const ClassName1 = 'Wnd1Class'; Window1Name = 'Window 1'; WindowWidth1 = 500; WindowHeight1 = 400; var Browser : IWebBrowser2; FensterH : HWND; wnd: HWND; vEmpty : OleVariant; function WndProc(hWnd1: HWND; uMsg: UINT; wParam: wParam; lParam: LParam): lresult; stdcall; var x, y : integer; PaintStructut : TPaintStruct; CanvasH : HDC; begin Result := 0; case uMsg of WM_CREATE: begin {Fenster zentrieren} x := GetSystemMetrics(SM_CXSCREEN); y := GetSystemMetrics(SM_CYSCREEN); MoveWindow(hWnd1, (x div 2) - (WindowWidth1 div 2), (y div 2) - (WindowHeight1 div 2), WindowWidth1, WindowHeight1, true); end; WM_DESTROY: begin if Browser <> nil then begin Browser.Quit; end; OleUninitialize(); PostQuitMessage(0); end; else Result := DefWindowProc(hWnd1, uMsg, wParam, lParam); end; end; var wc: TWndClassEx = ( cbSize : SizeOf(TWndClassEx); Style : CS_HREDRAW or CS_VREDRAW; lpfnWndProc : @WndProc; //Fensterfunktion für Fenster 1 cbClsExtra : 0; cbWndExtra : 0; lpszMenuName : nil; lpszClassName : ClassName1; //Klassenname für Fenster 1 hIconSm : 0; ); msg: TMsg; hr : HRESULT; begin {Struktur mit Infos für Fenster 1 füllen} wc.hInstance := hInstance; wc.hCursor := LoadCursor(0, IDC_ARROW); wc.hIcon := LoadIcon(HInstance,'MAINICON'); wc.hbrBackground := GetSysColorBrush(COLOR_BTNFACE); {Fenster 1 registrieren} RegisterClassEx(wc); {Fenste 1 erzeugen und hWnd1 zuweisen} FensterH := CreateWindowEx(0, ClassName1, Window1Name, WS_VISIBLE or WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WindowWidth1, WindowHeight1, 0, 0, hInstance, nil); if OleInitialize(nil) <> S_OK then begin CoCreateInstance(CLASS_InternetExplorer, nil, CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, Browser); //Browser initalisieren if Browser <> nil then begin VariantInit(vEmpty); Browser.Navigate('http://www.test.de/index.html', vEmpty, vEmpty, vEmpty, vEmpty); //Seite auswählen wnd := FindWindow('IEFrame', nil); wnd := FindWindowEx(wnd, 0, 'Frame Tab', nil); wnd := FindWindowEx(wnd, 0, 'TabWindowClass', nil); wnd := FindWindowEx(wnd, 0, 'Shell DocObject View', nil); //Ist das Fenster wo man einbinden kann SetParent(wnd,FensterH); //Parent auf Fenster setzen MoveWindow(wnd, 0, 0, WindowWidth1, WindowHeight1, true); //Größe des eingebetten Fensters anpassen end; end; while GetMessage(msg,0,0,0) do begin TranslateMessage(msg); DispatchMessage(msg); end; ExitCode := msg.wParam; end. |
AW: [NonVCL] Browser
Dir ist aber schon klar, dass deine Lösung höchst unstabil ist?
Sobald eine Änderung im IE stattfindet, kann deine Kette von FindWindow()-Aufrufen reisen. Man kann ja Programme nach ganz verschiedenen Gesichtspunkten wie z.B. Geschwindigkeit, möglichst geringem Resourcenverbrauch, Stabilität, Wartbarkeit, Portabilität optimieren. Non-VCL zielt dabei auf möglichst geringen Resourcenverbrauch und Geschwindigkeit. Wenn dabei aber die Stabilität unter den Tisch fällt; naja jeder muss selbst bewerten ob es das wert ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz