TWebView2

Fonte: source/classes/twebview2.prg

Overview

TWebView2 incorpora Microsoft Edge WebView2 numa janela ou diálogo FiveWin. Serve para alojar UIs HTML/CSS/JS modernas junto de controlos FWH nativos. Requer o Runtime WebView2.

Desktop + Web com uma única UI

O sample samples/DesktopWeb/login.prg mostra o padrão em que desktop e browser partilham o mesmo HTML/CSS/JS:

Compilar com VM multi-thread: samples\DesktopWeb\build.bat ou build_new.bat login hm64 -mt. Demo: admin/1234, demo/demo.

FWH 26.09

A API ampliada, incluindo bOnConsole e EnableConsole, está disponível desde FWH 26.09, dia 12 (12 de setembro de 2026). São recursos da biblioteca FWH; atualizar apenas o Runtime da Microsoft não basta. Bibliotecas anteriores podem não ter o setter DATA _BONCONSOLE nem o método EnableConsole.

Referência de métodos

C = string, N = número, L = lógico, HWND = handle do Windows. NIL indica ausência de retorno de estado; não é indicador de sucesso. "delegated" indica retorno do método da janela; "virtual" é um hook vazio. Início assíncrono e sucesso final são distintos.

AssinaturaRetornoComportamento
New( oWndParent, cUserDataFolder, cBrowserExecutableFolder )SelfCria a vista em oWndParent, ou uma janela própria se for NIL. Verifique hWebView se a criação falhar. O perfil vazio usa %LOCALAPPDATA%\FWH_webview2_UserData. O terceiro argumento seleciona a pasta do Runtime Fixed Version na criação.
Navigate( cUrl )NILInicia a navegação; bOnNavigationCompleted informa a conclusão.
NavigateEx( cUrl, cMethod, cHeaders, cBody )LEnvia uma requisição HTTP. O método vazio usa GET; os cabeçalhos usam linhas Nome: Valor separadas por CRLF. .T. indica início, não sucesso HTTP. Em runtimes antigos apenas GET simples pode usar Navigate como alternativa.
SetHtml( cHtml )NILCarrega uma string HTML.
Eval( cJavaScript )NILExecuta JavaScript na página; o resultado codificado em JSON chega de forma assíncrona a bOnEval.
InjectJavascript( cScript )NILAdiciona um elemento script por Eval. A CSP da página pode bloqueá-lo; os escapes do template JS também são processados. Use Eval para execução direta.
GoBack()NILVolta no histórico.
GoForward()NILAvança no histórico.
Reload()NILRecarrega a página atual.
Stop()NILPara a navegação atual.
Print()NILChama window.print() por Eval; não retorna um resultado síncrono de impressão.
CanGoBack()LIndica se há entrada anterior no histórico; .F. se indisponível.
CanGoForward()LIndica se há entrada seguinte no histórico; .F. se indisponível.
GetSource()CRetorna a URL atual, não o HTML da página; string vazia se indisponível.
GetDocumentTitle()CRetorna o título do documento, ou uma string vazia.
GetBrowserVersion()CLê no registro do Windows a versão instalada do Runtime Evergreen, ou uma string vazia. Não consulta a pasta Fixed Version selecionada.
SetZoomFactor( nZoom )NILAjusta o zoom do navegador apenas se 0.1 < nZoom < 10.0.
GetZoomFactor()NRetorna o zoom do navegador; 1.0 sem controlador.
SetSizeRatio( nRatio )NArmazena e retorna nRatio (inicialmente 1.0); não redimensiona o navegador nem muda o zoom.
GetSizeRatio()NRetorna o fator de escala armazenado para a aplicação.
SetSize( nWidth, nHeight )NILAjusta o tamanho do WebView em pixels.
SetTitle( cText )LChama SetWindowText em oWnd; retorna o indicador de sucesso da API do Windows.
Center()delegatedDelega a oWnd:Center(); o retorno pertence à classe da janela.
Run()delegatedDelega a oWnd:Activate(); não é um resultado de estado do WebView.
SetParent( oWnd )HWNDArmazena o novo pai, aplica estilos child/visible e reatribui a janela. Retorna o pai anterior de SetParent; zero também pode indicar ausência de pai anterior.
GetWindow()HWNDRetorna oWnd:hWnd, o handle da janela FWH associada.
SetUserAgent( cUserAgent )NILAltera o user agent do navegador.
SetBackGroundColor( nRgb )NILAjusta o fundo do controlador com um valor RGB do Windows.
OpenDevToolsWindow( lOnOff )NILAbre as ferramentas de desenvolvimento com .T.; .F. não fecha uma janela de ferramentas já aberta.
ShowDownloads( lOnOff )NILControla se a interface padrão aparece ao iniciar futuros downloads; .F. marca-os atendidos. Não abre nem fecha um diálogo de downloads existente.
SetDefaultScriptDialogs( lOn )NILAtiva/desativa os diálogos JS padrão; NIL usa .T. Use bOnScriptDialog para aceitá-los.
SetDefaultContextMenus( lOn )NILAtiva/desativa os menus de contexto padrão; NIL usa .T.
CloseWebView()NILFecha o navegador/controlador; o objeto da classe permanece.
Reinitialize()NILFecha e recria ambiente/controlador e reassocia eventos. Não retorna indicador de sucesso; restaure o estado da página/aplicação.
Reregister()NILReassocia eventos de zoom, diálogo JS e recursos web; remove antes os registros antigos.
End()NILDestrói a vista nativa, limpa hWebView e remove o objeto do registro de vistas.
SetContextMenuExclude( cCsv )CArmazena e retorna a lista CSV (NIL torna-se vazio). O filtro por item não está implementado com o SDK incluído.
EnableConsole( lOnOff )LAjusta e retorna lConsole (NIL usa .T.). Consulte a seção de console para injeção e desativação.
CapturePreview( cPngPath )LInicia captura PNG assíncrona. .F. indica que não iniciou; com .T. aguarde bOnCapturePreview(lOk,cPath,hWebView).
PrintToPdf( cPdfPath, lLandscape )LInicia exportação PDF assíncrona (.F./NIL em lLandscape indica retrato). Requer interfaces compatíveis do runtime. O resultado final chega a bOnPrintToPdf(lOk,cPath,hWebView), não ao indicador de início.
AddWebResourceRequestedFilter( cUri, nContext )NILAdiciona um filtro por padrão de URL; NIL no contexto usa WV_CONTEXT_ALL (0). bOnWebResource recebe as correspondências.
RemoveWebResourceRequestedFilter( cUri, nContext )NILRemove um filtro por padrão de URL; NIL no contexto usa WV_CONTEXT_ALL (0). bOnWebResource recebe as correspondências.
AddHostObject( cName ).F.Não implementado: não registra objeto host IDispatch.
RemoveHostObject( cName ).T.Operação de compatibilidade sem efeito; não remove objeto host nativo.
ClearBrowsingData( nKinds ).T.Enfileira remoção JS de cookies acessíveis, local/session storage e Cache Storage; NIL em nKinds usa 0. nKinds consta na confirmação, mas não seleciona categorias nativas. O evento assíncrono confirma o script, não a remoção de cada item.
ClearSession().T.Alias de ClearBrowsingData(0); não apaga todo o perfil.
ClearAllBrowsingData().T.Alias de ClearBrowsingData(0); apesar do nome não remove cookies HttpOnly nem todo o perfil.
Diag( nKind )NNIL usa 0. 0/1/2: HRESULT de registro para zoom/diálogo/recurso web. 3/4/5: contadores de eventos. Outros valores usam o contador de recursos web; sem vista nativa retorna -999.
Terminate()virtualHook virtual vazio; não substitui End().
Destroy()virtualHook virtual vazio; não substitui End().

Blocos de eventos

Atribua blocos com estes argumentos. hWebView é o ponteiro da vista nativa, não o objeto FWH; bOnBind recebe oWebView como segundo argumento. Retornos afetam o comportamento apenas quando indicado.

AssinaturaComportamento
bOnBind( uParams, oWebView )Recebe argumentos comuns de SendToFWH; retorno ignorado. Arrays de um elemento são desempacotados; console/limpeza usam eventos separados.
bOnEval( cJson, hWebView )Resultado JavaScript codificado em JSON; retorno ignorado.
bOnConsole( cJson, hWebView )JSON de console descrito abaixo; retorno ignorado.
bOnNavigationCompleted( cUrl, hWebView )Navegação principal concluída. Retorno ignorado.
bOnSourceChanged( cUrl, hWebView )URL de origem alterada. Retorno ignorado.
bOnDocumentTitleChanged( cTitle, hWebView )Título do documento alterado. Retorno ignorado.
bOnHistoryChanged( lCanBack, lCanFwd, hWebView )Disponibilidade do histórico alterada. Retorno ignorado.
bOnFrameNavCompleted( cUrl, hWebView )Navegação do frame concluída. Retorno ignorado.
bOnCapturePreview( lOk, cPath, hWebView )Resultado final da captura/gravação PNG. Retorno ignorado.
bOnPrintToPdf( lOk, cPath, hWebView )Resultado final da exportação PDF. Retorno ignorado.
bOnClearBrowsingData( lOk, cWhat, hWebView )Confirmação JS: .T., "javascript"; não comprova remoção completa do perfil. Retorno ignorado.
bOnZoomFactorChanged( nZoom, hWebView )Zoom do navegador alterado. Retorno ignorado.
bOnProcessFailed( nKind, hWebView )Falha do processo do navegador; tipo WV_FAIL_*. Retorno ignorado.
bOnFullScreen( lFull, hWebView )Estado HTML de tela cheia alterado. Retorno ignorado.
bOnNavigationStarting( cUrl, hWebView )Retorne .T. para cancelar; outros valores, ou valores não lógicos, não cancelam.
bOnFrameNavStarting( cUrl, hWebView )Retorne .T. para cancelar; outros valores, ou valores não lógicos, não cancelam.
bOnNewWindow( cUrl, hWebView )Apenas notificação: a vista nativa navega à URL e marca a requisição como atendida; o retorno não seleciona outra janela.
bOnPermission( cUrl, nKind, hWebView )Retorne WV_PERM_ALLOW (1), WV_PERM_DENY (2), ou 0 para padrão; nKind é o tipo de permissão do runtime.
bOnWebResource( cUrl, nContext, hWebView )Retorne .T. ou número diferente de zero para bloquear com HTTP 403 vazio; caso contrário permite. Instale os filtros antes.
bOnScriptDialog( cUri, nKind, cMsg, cDefault, hWebView )Retorne .T. para Accept; .F. mantém a gestão padrão (ou sem diálogo se desativada). Um bloco instalado com retorno não lógico é tratado como .T. Tipos WV_DIALOG_*. Não é exposta a troca da resposta de prompt.
bOnHostObject( cObjName, cMethod, cArg, hWebView )Hook reservado com retorno C; o registro nativo de objetos host não está implementado.

Console JavaScript

EnableConsole(.T.) intercepta console.log/warn/error/info sem remover a saída original do console e adiciona um listener de erros JavaScript. Envia um envelope interno por SendToFWH; bOnConsole recebe a string JSON interna, não o envelope externo. args contém strings: objetos são convertidos com JSON.stringify. line consta nos erros de window, não nas chamadas comuns a console.

Chame EnableConsole(.T.) após cada navegação principal: a interceptação é instalada uma vez por documento. EnableConsole(.F.) interrompe a entrega pelo despachante do console, mas não desfaz a interceptação JavaScript já instalada. Seu retorno lógico é o indicador armazenado, não prova de injeção correta. O console é separado das mensagens comuns de bOnBind.

Exemplos de JSON recebido

{
  "type": "log",
  "args": [
    "ready",
    "{\"count\":2}"
  ],
  "url": "https://example.com/"
}

{
  "type": "error",
  "args": [
    "Uncaught ReferenceError: x is not defined"
  ],
  "url": "https://example.com/",
  "line": 12
}

Exemplo de console

oWeb := TWebView2():New( oWnd )
IF ! Empty( oWeb:hWebView )
   oWeb:bOnConsole := { | cJson, hWebView | LogConsole( cJson ) }
   oWeb:bOnNavigationCompleted := { | cUrl, hWebView | oWeb:EnableConsole( .T. ) }
   oWeb:Navigate( "https://example.com/" )
ENDIF

STATIC FUNCTION LogConsole( cJson )
   LOCAL hData
   hb_jsonDecode( cJson, @hData )
   IF ValType( hData ) == "H"
      // hData[ "type" ], hData[ "args" ], hData[ "url" ]
      // hData[ "line" ]: only for a window error
      OutputDebugString( cJson )
   ENDIF
RETURN NIL

Compatibilidade de bibliotecas

Para aceitar bibliotecas FWH anteriores, verifique a atribuição do DATA e a chamada a EnableConsole. Use a mesma verificação ao ativar o rastreamento após navegar. Apenas o diagnóstico do console é omitido; o tráfego comum SendToFWH/bOnBind não muda.

IF __objHasMsg( oWeb, "_BONCONSOLE" ) .AND. ;
   __objHasMsg( oWeb, "ENABLECONSOLE" )
   oWeb:bOnConsole := { | cJson, hWebView | LogConsole( cJson ) }
   oWeb:EnableConsole( .T. )
ENDIF

Limites e requisitos do runtime

AddHostObject não está implementado. SetContextMenuExclude armazena a lista mas não filtra itens do menu. A limpeza usa JavaScript, não apaga todo o perfil nem cookies HttpOnly. Verifique o resultado PNG/PDF assíncrono nos eventos. As interfaces disponíveis do runtime podem limitar PDF, downloads e requisições HTTP. Consulte samples/webview2/wvdemo.prg + pulse.html e as constantes WV_CONTEXT_*, WV_DIALOG_*, WV_PERM_* e WV_FAIL_* em include/WebView2.ch.

See Classes Alfabético for full class list.

Veja Também