OnlyTL

OnlyTL

C# Silverlight 调用 Google Chrome

C#
1837
2020-09-09
C# Silverlight 调用 Google Chrome

C# Silverlight 调用 Google Chrome

  Silverlight 是微软公司推出的的一项 RIA(Rich Internet Application,富网络应用),是一种跨浏览器、跨平台的 .Net Framework的实现,用来构建web交互应用,统一了服务器、Web、桌面的功能。

本文将介绍在 Silverlight 中通过 C# 代码来调用本地Google Chrome

调用流程

  • 从注册表获取Chrome程序安装路径 调用RegRagd()方法,从注册表中返回项值或值名。
  • 获取默认安装路径 当注册表获取不到时,获取Chrome的默认安装路径。   32位地址   C:\Program Files (x86)\Google\Chrome\Application\   64位地址   C:\Program Files\Google\Chrome\Application\

示例代码

  • 从注册表获取安装路径
/// <summary>
/// 从注册表获取Chrome安装路径
/// </summary>
/// <param name="path"></param>
public static string GetInstallPath()
{
    if (Application.Current.HasElevatedPermissions && AutomationFactory.IsAvailable)
    {
        using (dynamic shell = AutomationFactory.CreateObject("WScript.Shell"))
        {
            try
            {
                var path = shell.RegRead(@"HKCU\Software\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe\");
                return path;
            }
            catch (Exception e)
            {
                return null;
            }
        }
    }
    else
    {
        MessageBox.Show("需操作注册表获取Chrome安装路径,请安装证书提升权限!");
        return null;
    }
}

注意:如果本机安装了Google Chrome ,一般注册表就会获取到安装路径

  • 获取默认安装路径(注册表获取为空)
if (string.IsNullOrEmpty(path))
{
    //32位安装路径
    appPath = @"C:\Program Files (x86)\Google\Chrome\Application\";
    appName = @"chrome.exe";
}
else
{
    //验证注册表路径标准:以.exe结尾
    int index = path.ToUpper().LastIndexOf(".EXE");
    if (index > 0)
    {
        int i = path.LastIndexOf("\\");
        appPath = path.Substring(0, i + 1);
        appName = path.Substring(i + 1);
    }
    else
    {
        appPath = appName = "";
        return "注册表路径未包含:.EXE";
    }
}
  • 判断.exe文件是否存在
try
{
    using (dynamic fileSystemObject = AutomationFactory.CreateObject("Scripting.FileSystemObject"))
    {
        if (fileSystemObject.FileExists(appPath + appName))
        {
            //路径如果带空格会出错,用引号处理
            string cmd = "\"" + appPath + appName + "\"";
            RunAppByOS(cmd, url);
        }
        else
        {
            //63位安装路径
            appPath = @"C:\Program Files\Google\Chrome\Application\";
            appName = @"chrome.exe";
            if (fileSystemObject.FileExists(appPath + appName))
            {
                string cmd = "\"" + appPath + appName + "\"";
                RunAppByOS(cmd, url);
            }
            else
            {
                //当通过注册表,32位安装路径,64位安装路径未找到时,提示下载
                result = string.Format("在\"{0}\"下未能找到\"{1}\"", appPath, appName);
                MessageBox.Show("在本地未找到谷歌浏览器,请下载后打开");
                HtmlPage.Window.Navigate(new Uri("https://www.google.cn/intl/zh-CN/chrome/", UriKind.Absolute), "_blank");
            }
        }
    }
}
catch (Exception ex)
{
    result = string.Format("打开\"{0}\"失败\n{1}", appName, ex.Message);
}
  • 打开软件
public static void RunAppByOS(string cmd, string param)
{
    RunApplication(cmd + " " + param);
}

/// <summary>
/// SilverLight运行本地客户端程序
/// </summary>
/// <param name="path"></param>
public static void RunApplication(string path, int windowStyle = 1, bool waitOnReturn = false)
{
    if (Application.Current.HasElevatedPermissions && AutomationFactory.IsAvailable)
    {

        using (dynamic shell = AutomationFactory.CreateObject("WScript.Shell"))
        {
            try
            {
                shell.Run(path);
            }
            catch (Exception e)
            {
                MessageBox.Show("软件执行出错, 请重试!\n" + e.Message);
            }
        }
    }
    else
    {
        MessageBox.Show("需调用本地应用程序,请安装证书提升权限!");
    }
}

这样,就可在 Silverlight 中通过 C#代码 调用谷歌浏览器,以此类推,调用本地其他程序,也可利用此方法,调用其他程序,需换掉注册表项。

结语

  SilverLight 是一项极其古老的技术,已被微软抛弃,2012年微软发布 SilverLight 5,至此再也没更新过,并且 VS2017 后,也不再支持 SilverLight 开发。网络上关于 SilverLight 的信息特别少,所以在此记录一点是一点…