我是否正确理解EdgeHTML现在可以在Windows 10中用于桌面(Win32 / Win64应用程序)?根据这些博客文章:
https://blogs.windows.com/msedgedev/2018/05/09/modern-webview-winforms-wpf-apps/ https://blogs.windows.com/msedgedev/2018/10/04/edgehtml-18- october-2018-update / https://docs.microsoft.com/zh-cn/windows/communitytoolkit/controls/wpf-winforms/webview
似乎Microsoft已添加了EdgeHTML WebViewControl for Windows桌面(Win32)应用程序,该应用程序到目前为止尚不适用于桌面应用程序(仅基于Trident的MSHTML控件可用于桌面应用程序)。
如果是这样,是否有可能在Delphi / C ++ Builder中使用它,还是必须在RAD Studio的新更新中等待新的TWebView控件?如果可能-是否有任何代码示例可供查看(C ++ Builder或Delphi)?.NET的要求是否意味着它不能在RAD Studio生产的常规Win32 / Win64应用中使用?
WebView控件是通过WinRT提供的,并且不依赖于.net。您可以从普通的Win32应用程序中使用它。
WinRT(Windows运行时)现在已在Windows 10中更名为UWP(通用Windows平台),类似于COM的后继产品。
像COM一样,它很大程度上基于接口,并且可用接口在类型库中定义。对于WinRT,类型库存储在Windows系统目录中的* .WinMD文件中。包含我们需要嵌入Edge浏览器的功能的类型库为Windows.Web.winmd
。
Delphi确实支持使用WinRT组件,并且随附一些类型库的翻译以及一些其他与WinRT一起使用的辅助函数和类。
但是,当前没有工具可以将WinMD文件或从WinMD文件派生的IDL文件自动转换为Delphi代码。如果要使用Delphi附带的WinRT功能,则必须手动将类型定义转换为Delphi代码。
WinRT大量使用与Delphi中通用接口的工作方式不兼容的通用接口(带有类型参数的接口)。在翻译类型定义时,这需要一些手动调整。
如果安装Windows Platform SDK,则会在目录中找到WinRT类型库的IDL和C ++转换Drive:\Windows Kits\10\Include\10.0.17134.0\winrt
。
我已使用这些文件作为模板来创建一个非常基本的概念验证项目Delphi(用于Delphi 10.2),该项目使用嵌入式Edge浏览器。您可以在下面找到代码。为了对此进行测试,只需创建一个新的VCL项目,粘贴代码并将FormCreate
,FormDestroy
和FormResize
事件与表单连接。
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Types, Winapi.Winrt, System.Win.WinRT, WinAPI.Foundation, WinAPI.Foundation.Types; const SWebViewCOntrolProcess= 'Windows.Web.UI.Interop.WebViewControlProcess'; type // Interface with functionality to interact with WebBrowser Control // https://docs.microsoft.com/en-us/uwp/api/windows.web.ui.iwebviewcontrol IWebViewCOntrol= interface(IInspectable) ['{3F921316-BC70-4BDA-9136-C94370899FAB}'] procedure Placeholder_SourceGet; safecall; procedure Placeholder_SourcePut; safecall; procedure Placeholder_DocumentTitle; safecall; procedure Placeholder_CanGoBack; safecall; procedure Placeholder_CanGoForward; safecall; procedure Placeholder_DefaultBackgroundColorPut; safecall; procedure Placeholder_DefaultBackgroundColorGet; safecall; procedure Placeholder_ContainsFullScreenElement; safecall; procedure Placeholder_Settings; safecall; procedure Placeholder_DeferredPermissionRequests; safecall; procedure Placeholder_GoForward; safecall; procedure Placeholder_GoBack; safecall; procedure Placeholder_Refresh; safecall; procedure Placeholder_Stop; safecall; procedure Navigate(source: IUriRuntimeClass); stdcall; procedure NavigateToString(text: HString); stdcall; // TODO: Declare further properties and functions of IWebViewControl end; IWebViewCOntrolProcess= interface; // Declare IWebViewControlSite IWebViewCOntrolSite= interface(IInspectable) ['{133F47C6-12DC-4898-BD47-04967DE648BA}'] function get_Process: IWebViewControlProcess; safecall; procedure put_Scale(value: Double); safecall; function get_Scale: Double; safecall; procedure put_Bounds(value: TRectF); safecall; function get_Bounds: TRectF; safecall; procedure put_IsVisible(value: Boolean); safecall; function get_IsVisible: Boolean; safecall; // TODO: Declare further properties and functions of IWebViewControlSite property Process: IWebViewControlProcess read get_Process; property Scale: Double read get_Scale write put_Scale; property Bounds: TRectF read get_Bounds write put_Bounds; property IsVisible: Boolean read get_IsVisible write put_IsVisible; end; // types for reacting to when the WebView has finished initialization IAsyncOperation_1__IWebViewCOntrol= interface; IAsyncOperationCompletedHandler_1__IWebViewCOntrol= interface(IUnknown) ['{d61963d6-806d-50a8-a81c-75d9356ad5d7}'] procedure Invoke(asyncInfo: IAsyncOperation_1__IWebViewControl; asyncStatus: AsyncStatus); safecall; end; IAsyncOperation_1__IWebViewCOntrol= interface(IInspectable) ['{ac3d28ac-8362-51c6-b2cc-16f3672758f1}'] procedure put_Completed(handler: IAsyncOperationCompletedHandler_1__IWebViewControl); safecall; function get_Completed: IAsyncOperationCompletedHandler_1__IWebViewControl; safecall; function GetResults: IWebViewControl; safecall; property Completed: IAsyncOperationCompletedHandler_1__IWebViewControl read get_Completed write put_Completed; end; TWebViewCOntrolCompleted= procedure(asyncInfo: IAsyncOperation_1__IWebViewControl; aasyncStatus: AsyncStatus) of object; TWebViewCOntrolCompletedHandler= class(TInspectableObject, IAsyncOperationCompletedHandler_1__IWebViewControl ) private FEvent: TWebViewControlCompleted; public procedure Invoke(asyncInfo: IAsyncOperation_1__IWebViewControl; aasyncStatus: AsyncStatus); safecall; constructor Create(AEvent: TWebViewControlCompleted); end; // The interface for interacting with the process hosting the web view control // https://docs.microsoft.com/en-us/uwp/api/windows.web.ui.interop.webviewcontrolprocess [WinRTClassNameAttribute(SWebViewControlProcess)] IWebViewCOntrolProcess= interface(IInspectable) ['{02C723EC-98D6-424A-B63E-C6136C36A0F2}'] function get_ProcessId: Cardinal; safecall; function get_EnterpriseId: HSTRING; safecall; function get_IsPrivateNetworkClientServerCapabilityEnabled: Boolean; safecall; function CreateWebViewControlAsync(hostWindowHandle: Int64; bounds: TRectF): IAsyncOperation_1__IWebViewControl; safecall; procedure Placeholder_GetWebViewControls; safecall; procedure Terminate; safecall; property ProcessId: Cardinal read get_ProcessId; property EnterpriseId: HSTRING read get_EnterpriseId; property IsPrivateNetworkClientServerCapabilityEnabled: Boolean read get_IsPrivateNetworkClientServerCapabilityEnabled; // TODO: //[eventadd] HRESULT ProcessExited([in] Windows.Foundation.TypedEventHandler* handler, [out] [retval] EventRegistrationToken* token); //[eventremove] HRESULT ProcessExited([in] EventRegistrationToken token); end; // The CoClass to create an IWebViewControlProcess instance TWebViewCOntrolProcess= class(TWinRTGenericImportI ) end; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormResize(Sender: TObject); private { Private declarations } FProcess: IWebViewControlProcess; FBrowser: IWebViewControl; FBrowserSite: IWebViewControlSite; procedure WebViewCompleted(asyncInfo: IAsyncOperation_1__IWebViewControl; aasyncStatus: AsyncStatus); public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var Rect: TRectF; AsyncOperation: IAsyncOperation_1__IWebViewControl; CompletedHandler: IAsyncOperationCompletedHandler_1__IWebViewControl; begin CompletedHandler:=TWebViewControlCompletedHandler.Create(WebViewCompleted); // Size for browser Rect:= TRectF.Create(0, 0, ClientWidth, ClientHeight); // Create hosting process FProcess:= TWebViewControlProcess.Create(); // Create WebView Control AsyncOperation:= FProcess.CreateWebViewControlAsync(self.Handle, Rect); // We will get notified when the control creation is finished AsyncOperation.Completed:= CompletedHandler; end; procedure TForm1.FormDestroy(Sender: TObject); begin // If there is a hosting process, then terminate it if Assigned(FProcess) then begin FProcess.Terminate; end; end; procedure TForm1.FormResize(Sender: TObject); begin if Assigned(FBrowserSite) then begin FBrowserSite.Bounds := TRectF.Create(0,0,ClientWidth, ClientHeight); end; end; procedure TForm1.WebViewCompleted( asyncInfo: IAsyncOperation_1__IWebViewControl; aasyncStatus: AsyncStatus); var WinS: TWindowsString; Uri: IUriRuntimeClass; begin // Initializing the WebView control was successful // Remember reference to control FBrowser:= asyncInfo.GetResults(); FBrowserSite := FBrowser as IWebViewControlSite; // Load web page into control WinS:= TWindowsString.Create('http://www.whatismybrowser.com'); Uri:= TUri.CreateUri(WinS); FBrowser.Navigate(Uri); end; { TWebViewControlCompletedHandler } constructor TWebViewControlCompletedHandler.Create( AEvent: TWebViewControlCompleted); begin FEvent := AEvent; end; procedure TWebViewControlCompletedHandler.Invoke( asyncInfo: IAsyncOperation_1__IWebViewControl; aasyncStatus: AsyncStatus); begin FEvent(asyncInfo, aasyncStatus); end; end.