Estou entendendo corretamente que o EdgeHTML agora está disponível para desktop (aplicativos Win32 / Win64) agora no Windows 10? De acordo com essas postagens de blog:
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/en-us/windows/communitytoolkit/controls/wpf-winforms/webview
Parece que a Microsoft adicionou EdgeHTML WebViewControl para aplicativos de desktop do Windows (Win32) que não estavam disponíveis para aplicativos de desktop até agora (apenas o controle MSHTML baseado em Trident estava disponível para aplicativos de desktop).
Se isso for verdade, existe a possibilidade de utilizar isso no Delphi / C ++ Builder ou temos que esperar por um novo controle TWebView na nova atualização do RAD Studio? Se possível - existem exemplos de código para examinar (C ++ Builder ou Delphi)? E o requisito do .NET significa que ele não pode ser utilizado em aplicativos Win32 / Win64 normais produzidos pelo RAD Studio?
O RAD Studio 10.4 Sydney vem com suporte aprimorado para o novo navegador Edge baseado em Chromium da Microsoft.
Há um novo controle http://docwiki.embarcadero.com/Libraries/Sydney/en/Vcl.Edge.TEdgeBrowserque pode ser usado para usar o mecanismo do navegador Edge diretamente, bem como a possibilidade de permitir que o TWebBrowsercontrole clássico use o novo mecanismo de renderização Edge automaticamente quando estiver disponível por meio dohttp://docwiki.embarcadero.com/Libraries/Sydney/en/SHDocVw.TWebBrowser.SelectedEngine propriedade.
Explicação detalhada nesta entrada de blog da Embarcadero:
Esta resposta está desatualizada, mas pode ser interessante aprender sobre a base técnica. O RAD Studio 10.4 Sydney agora oferece suporte ao uso do navegador Edge pronto para uso. Vejohttps://stackoverflow.com/a/62446446/101087.
O controle WebView é oferecido via WinRT e não depende de .net. Você pode usá-lo em aplicativos Win32 normais.
WinRT (Windows Runtime), agora no Windows 10 rebatizado como UWP (Universal Windows Platform), é algo como o sucessor do COM.
Como o COM, ele é fortemente baseado em interfaces e as interfaces disponíveis são definidas em bibliotecas de tipos. Para WinRT, as bibliotecas de tipos são armazenadas em arquivos * .WinMD no diretório de sistema do Windows. A biblioteca de tipos que contém a funcionalidade de que precisamos para incorporar o navegador Edge é Windows.Web.winmd.
O Delphi oferece suporte ao uso de componentes WinRT e vem com traduções de algumas bibliotecas de tipos e algumas funções auxiliares e classes adicionais para trabalhar com o WinRT.
No entanto, não existe atualmente nenhuma ferramenta para traduzir automaticamente arquivos WinMD ou arquivos IDL derivados de arquivos WinMD para código Delphi. Se você deseja usar a funcionalidade WinRT que não vem com o Delphi, você deve traduzir manualmente as definições de tipo para o código Delphi.
O WinRT usa fortemente interfaces genéricas (interfaces com parâmetros de tipo) que não são compatíveis com a maneira como as interfaces genéricas funcionam no Delphi. Isso requer alguns ajustes manuais ao traduzir as definições de tipo.
Se você instalar o Windows Platform SDK, encontrará traduções IDL e C ++ das bibliotecas de tipo WinRT em um diretório como Drive:\Windows Kits\10\Include\10.0.17134.0\winrt.
Usei esses arquivos como modelos para criar um projeto Delphi de Prova de Conceito muito básico (para Delphi 10.2) que usa um navegador Edge embutido. Você pode encontrar o código abaixo. Para testar isso, basta criar um novo projeto VCL, colar o código e conectar os eventos FormCreate, FormDestroye FormResizeao formulário.
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<Windows.Web.UI.Interop.WebViewControlProcess*, IInspectable*>* handler, [out] [retval] EventRegistrationToken* token);
//[eventremove] HRESULT ProcessExited([in] EventRegistrationToken token);
end;
// The CoClass to create an IWebViewControlProcess instance
TWebViewControlProcess = class(TWinRTGenericImportI<IWebViewControlProcess>)
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.

Jana Duggar foi aberta sobre sua busca pelo amor. Aqui está tudo o que ela disse sobre o assunto e sua janela de cinco anos para o casamento.
O astro de 'Outlander', Sam Heughan, revelou recentemente o que vai levar do set para relembrar Jamie Fraser, o papel que o tornou uma estrela.
'She Loves You' foi escrita em uma hora, gravada em um dia, e foi a música dos Beatles com uma de suas melhores apresentações de sua carreira.
Dolly Parton e sua avó Bessie tiveram um relacionamento especial. Vovó Parton estava muito doente, mas isso não impediu Dolly de pregar uma peça nela.
Você pode achar que o carvalho ou a nogueira são madeiras resistentes, mas quando se trata da madeira mais dura do mundo, elas nem chegam perto.
O oceano é repleto de beleza, mas também esconde algumas das criaturas marinhas mais assustadoras do planeta. Muitos desses animais espreitam nas profundezas do oceano, no mundo escuro e de alta pressão do fundo do mar.
Se você está enfrentando criaturas hostis ou se preparando para cenários PvP, conhecer os melhores encantamentos de espada no Minecraft pode te dar uma grande vantagem. Encantar espadas permite causar mais dano, aumentar a quantidade de itens obtidos de criaturas e prolongar a durabilidade da sua espada.
Quando as pessoas falam sobre países socialistas, geralmente imaginam o controle total do governo e a ausência de propriedade privada. Mas, na prática, as economias socialistas variam muito.
“Children” traz uma participação especial de grande nome e algumas notícias devastadoras
Este RAV4 está em excelentes condições e está preparado para um jogo de cadeiras musicais.
Imagens de drone capturaram bombeiros parecendo lutar para apagar o incêndio.
Eyes of Wakanda está diretamente relacionado ao MCU, além de atualizações sobre X-Men '97, What If..., Demolidor e muito mais.
O anel de noivado de Kate Middleton pertenceu à Princesa Diana antes do Príncipe William pedi-la em casamento. Descubra tudo o que há para saber sobre a peça histórica aqui.
John Cleese se casou com sua esposa, Jennifer Wade, em 2012. Aqui está tudo o que você precisa saber sobre a esposa de John Cleese, Jennifer Wade.
Patton Oswalt se casou com sua esposa, a também atriz Meredith Salenger, em 2017. Aqui está tudo o que você precisa saber sobre a esposa de Patton Oswalt, Meredith Salenger.
Mena Suvari é casada com o marido Michael Hope desde 2018. Aqui está tudo o que você precisa saber sobre o marido de Mena Suvari.
Isso me atinge De repente, como tantas vezes acontece É o meio do caminho tudo de novo <Não, não aquele no Pacífico, seu marrom, aquele no carnaval> Todas as manchetes em voz alta…..
Em 2022, com o lançamento do GPT-3, a habilidade de escrita parece se tornar menos importante. Com a IA, pessoas com redação ruim também podem gerar funcionários de qualidade.
No mundo acelerado e competitivo de hoje, a carreira desempenha um papel significativo no crescimento pessoal, na estabilidade financeira e na satisfação geral com a vida. No entanto, muitos indivíduos encontram-se presos em um ciclo implacável de estagnação e insatisfação, definhando gradualmente em suas vidas profissionais.
Na semana passada, notei um comunicado de imprensa, enviado via PressGazette (um site de notícias da mídia britânica). O artigo anunciava que a Acast, a empresa de publicidade e hospedagem de podcast Scandi, lideraria um consórcio de "provavelmente os editores mais influentes" em podcasting.