DETECTAR CONTROLE WEBVIEW2 NO MICRO DO USUÁRIO
Bom dia!
Depois de muito tempo, estou de volta e com uma dificuldade "cabeluda".
No meu programa em (C# - Dot.Net 4.8 e plataforma x86), mudei o controle Webbrowser para o novo WebView2. Está tudo funcionando, porém quis implementar uma rotina na inicialização do programa, para detectar se esse controle está instalado no micro do usuário (novos usuários/instalações), uma vez que ele não é nativo do VS e sim do EDGE e nem sempre está presente nos micros, inclusive pode ter apenas a versão 64bits e não a 32bits. Tive de instalar este controle por NuGet no VS. Caso a rotina não detecte o controle, ela faz a instalação em segundo plano, usando o instalador offline da própria Microsoft que vou enviar junto. O problema é que a rotina que criei, inclusive com ajuda do ChatGPT, nunca consegue achar o controle, mesmo ele estando instalado. Abaixo transcrevo as formas que tentei implementar, pelo Registro do Windows e também por API, mas é impossível detectar a presenta desse controle no micro.
Será que alguém já passou por isso e sabe como resolver?
Nota: Como estou usando a versão x86 do controle, mesmo estando rodando no Windows 64bits, tem que checar essa versão, pois há recursos no meu programa que exigem x86 e tenho de rodar nessa plataforma.
Tentativa 1
Tentativa 2
Tentativa 3 - (Usando Registro do Windows + API)
Todas retornam Não encontrado, seja no meu micro desenvolvimento ou na Sandbox do Windows para teste limpo. Na Sandbox ele faz a instalação sem problema, na primeira execução, mas na segunda execução, continua não encontrando, só que a instalação falha, pois já existe.
Depois de muito tempo, estou de volta e com uma dificuldade "cabeluda".
No meu programa em (C# - Dot.Net 4.8 e plataforma x86), mudei o controle Webbrowser para o novo WebView2. Está tudo funcionando, porém quis implementar uma rotina na inicialização do programa, para detectar se esse controle está instalado no micro do usuário (novos usuários/instalações), uma vez que ele não é nativo do VS e sim do EDGE e nem sempre está presente nos micros, inclusive pode ter apenas a versão 64bits e não a 32bits. Tive de instalar este controle por NuGet no VS. Caso a rotina não detecte o controle, ela faz a instalação em segundo plano, usando o instalador offline da própria Microsoft que vou enviar junto. O problema é que a rotina que criei, inclusive com ajuda do ChatGPT, nunca consegue achar o controle, mesmo ele estando instalado. Abaixo transcrevo as formas que tentei implementar, pelo Registro do Windows e também por API, mas é impossível detectar a presenta desse controle no micro.
Será que alguém já passou por isso e sabe como resolver?
Nota: Como estou usando a versão x86 do controle, mesmo estando rodando no Windows 64bits, tem que checar essa versão, pois há recursos no meu programa que exigem x86 e tenho de rodar nessa plataforma.
Tentativa 1
public static bool IsWebView2RuntimeInstalled()
{
const string keyGuid = "{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}";
string[] possibleKeys =
{
// 64-bit machine checking 32-bit side
@"SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\" + keyGuid,
// 64-bit machine checking 64-bit side
@"SOFTWARE\Microsoft\EdgeUpdate\Clients\" + keyGuid,
// per-user side
@"Software\Microsoft\EdgeUpdate\Clients\" + keyGuid
};
foreach (var baseKey in new[] { Registry.LocalMachine, Registry.CurrentUser })
{
foreach (var subPath in possibleKeys)
{
using (var k = baseKey.OpenSubKey(subPath))
{
if (k != null)
{
var pv = k.GetValue("pv") as string;
if (!string.IsNullOrEmpty(pv) && pv != "0.0.0.0")
{
return true;
}
}
}
}
}
return false;
}Tentativa 2
public static bool WebView2Installed()
{
try
{
// 1 - Chave padrão usada pelo Evergreen Runtime
using (var k = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(
@"SOFTWARE\Microsoft\EdgeUpdate\Clients"))
{
if (k != null)
{
var subKeys = k.GetSubKeyNames();
foreach (var name in subKeys)
{
using (var sub = k.OpenSubKey(name))
{
var pv = sub.GetValue("pv")?.ToString() ?? "";
if (!string.IsNullOrEmpty(pv) && pv.Contains("."))
return true;
}
}
}
}
// 2 - Verificação alternativa Win11 (Edge WebView2 integrado)
using (var k2 = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(
@"SOFTWARE\Microsoft\Edge"))
{
var version = k2?.GetValue("version")?.ToString();
if (!string.IsNullOrEmpty(version))
return true;
}
return false;
}
catch
{
return false;
}
} Tentativa 3 - (Usando Registro do Windows + API)
private const string WebView2ClientGuid = "{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}";
public static bool IsWebView2RuntimeInstalled()
{
// Checar registro por máquina (32/64) e por usuário
string[] regPaths = new string[]
{
$@"SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{WebView2ClientGuid}",
$@"SOFTWARE\Microsoft\EdgeUpdate\Clients\{WebView2ClientGuid}",
$@"Software\Microsoft\EdgeUpdate\Clients\{WebView2ClientGuid}"
};
// Verificar no HKLM e HKCU
foreach (var baseKey in new[] { Registry.LocalMachine, Registry.CurrentUser })
{
foreach (var subPath in regPaths)
{
using (var key = baseKey.OpenSubKey(subPath))
{
if (key != null)
{
var pv = key.GetValue("pv") as string;
if (!string.IsNullOrEmpty(pv) && pv != "0.0.0.0")
{
return true;
}
}
}
}
}
return false;
}
public static bool IsWebView2RuntimeAvailableViaApi()
{
try
{
string version = CoreWebView2Environment.GetAvailableBrowserVersionString(null);
return !string.IsNullOrEmpty(version);
}
catch
{
return false;
}
} Todas retornam Não encontrado, seja no meu micro desenvolvimento ou na Sandbox do Windows para teste limpo. Na Sandbox ele faz a instalação sem problema, na primeira execução, mas na segunda execução, continua não encontrando, só que a instalação falha, pois já existe.
Faça seu login para responder