Silverlight操作客户端注册表(优化)

前面贴出了Silverlight在OOB模式下操作客户端的注册表,后来自己又对代码进行了优化,将其封装成了一个操作类。

1.新建一个Silverlight类库,命名为ZKR.Silverlight.Core;

2.在类库下新建类,命名为LocalRegistryModel.cs;

3.实现代码:

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace ZKR.Silverlight.Core
{
    /// <summary>
    /// 本地已安装软件的注册表对象(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall)
    /// </summary>
    public class LocalRegistryModel
    {
        /// <summary>
        /// 注册表名称
        /// </summary>
        public string RegName { get; set; }
        /// <summary>
        /// 软件名称
        /// </summary>
        public string DisplayName { get; set; }
        /// <summary>
        /// 软件版本
        /// </summary>
        public string DisplayVersion { get; set; }
        /// <summary>
        /// 发布者
        /// </summary>
        public string Publisher { get; set; }
        /// <summary>
        /// 安装目录
        /// </summary>
        public string InstallLocation { get; set; }
        /// <summary>
        /// 安装日期
        /// </summary>
        public string InstallDate { get; set; }
        /// <summary>
        /// 运行路径(可能是图标路径)
        /// </summary>
        public string DisplayIcon { get; set; }
        /// <summary>
        /// 卸载路径
        /// </summary>
        public string UninstallString { get; set; }

        public LocalRegistryModel()
        { }
    }
}


4.在类库下新建类,命名为LocalMachine.cs;

5.实现代码:

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

using System.Runtime.InteropServices.Automation;
using System.Collections.ObjectModel;

namespace ZKR.Silverlight.Core
{
    /// <summary>
    /// 本地计算机对象(引用Microsoft.CSharp.dll)
    /// </summary>
    public class LocalMachine
    {
        #region 私有变量
        /// <summary>
        /// 注册表操作对象
        /// </summary>
        private static dynamic ObjReg = null;
        /// <summary>
        /// 已安装软件在注册表的路径
        /// </summary>
        private static string HKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
        #endregion

        /// <summary>
        /// 构造函数
        /// </summary>
        public LocalMachine()
        { }

        #region 公共方法
        /// <summary>
        /// 将该Silverlight应用程序加入开机自动启动列表
        /// </summary>
        /// <returns>程序执行过程中的提示信息</returns>
        public static string AddStartMenu()
        {
            string result = "";
            using (dynamic ShellApplication = AutomationFactory.CreateObject("Shell.Application")) //创建Shell对象
            {
                #region 获取程序菜单中的该Silverlight应用程序的快捷方式
                dynamic commonPrograms = ShellApplication.NameSpace(2); //获取本地开始菜单==》程序菜单
                string allUsersPath = commonPrograms.Self.Path;
                dynamic link = commonPrograms.ParseName(Deployment.Current.OutOfBrowserSettings.ShortName + ".lnk"); //获取当前Silverlight程序的快捷方式
                #endregion

                #region 获取桌面上的该Silverlight应用程序的快捷方式
                if (link == null)
                {
                    commonPrograms = ShellApplication.NameSpace(0); //获取本地桌面菜单
                    allUsersPath = commonPrograms.Self.Path;
                    link = commonPrograms.ParseName(Deployment.Current.OutOfBrowserSettings.ShortName + ".lnk"); //获取当前Silverlight程序的快捷方式
                    if (link == null)
                    {
                        result = "在程序菜单和桌面上未找到该程序的快捷方式,不能加载到启动项中.";
                    }
                }
                #endregion

                #region 将快捷方式写入开机自动启动列表
                if (string.IsNullOrEmpty(result))
                {
                    using (dynamic WShell = AutomationFactory.CreateObject("WScript.Shell"))
                    {
                        WShell.RegWrite(@"HKLM\Software\Microsoft\Windows\CurrentVersion\Run\" + Deployment.Current.OutOfBrowserSettings.ShortName, link.Path);
                        result = "请重启你的机器,你的应用将被自动载入启动列表.";
                    }
                }
                #endregion
            }
            return result;
        }

        /// <summary>
        /// 将该Silverlight应用程序从开机自动启动列表中移除
        /// </summary>
        /// <returns></returns>
        public static string RemoveStartMenu()
        {
            string result = "";
            using (dynamic WShell = AutomationFactory.CreateObject("WScript.Shell"))
            {
                try
                {
                    WShell.RegDelete(@"HKLM\Software\Microsoft\Windows\CurrentVersion\Run\" + Deployment.Current.OutOfBrowserSettings.ShortName);
                    result = "移除成功.";
                }
                catch
                {
                    result = "没有找到该启动项.";
                }
            }
            return result;
        }

        /// <summary>
        /// 运行本地应用程序
        /// </summary>
        /// <param name="ApplicationPath">要运行的应用程序的路径</param>
        public static void RunApplication(string ApplicationPath)
        {
            if (!string.IsNullOrEmpty(ApplicationPath))
            {
                using (dynamic cmd = AutomationFactory.CreateObject("WScript.Shell"))
                {
                    try { cmd.Exec(@ApplicationPath); }
                    catch { }
                }
            }
        }

        /// <summary>
        /// 卸载本地应用程序
        /// </summary>
        /// <param name="ApplicationPath">要卸载的应用程序的路径</param>
        public static void UninstallApplication(string ApplicationPath)
        {
            if (!string.IsNullOrEmpty(ApplicationPath))
            {
                using (dynamic cmd = AutomationFactory.CreateObject("WScript.Shell"))
                {
                    try { cmd.Exec(ApplicationPath); }
                    catch { }
                }
            }
        }

        /// <summary>
        /// 获取本地已安装软件列表(忽略名称为空的软件信息)
        /// </summary>
        /// <returns>已安装软件列表</returns>
        public static ObservableCollection<LocalRegistryModel> GetInstallSoftware()
        {
            ObservableCollection<LocalRegistryModel> ListReg = new ObservableCollection<LocalRegistryModel>();
            dynamic ShellApplication = null;
            try
            {
                ShellApplication = AutomationFactory.CreateObject("WbemScripting.SWbemLocator"); //创建Shell对象
            }
            catch { return ListReg; }

            ObjReg = ShellApplication.ConnectServer(".", @"/root/default"); //连接到主机
            ObjReg = ObjReg.get("StdRegProv"); //创建注册表访问对象

            object[] InstalledSoft = GetSubKeys();
            if (InstalledSoft != null)
            {
                foreach (object SoftItem in InstalledSoft)
                {
                    LocalRegistryModel reg = DisposeSubKey(SoftItem.ToString());
                    if (reg != null && !string.IsNullOrEmpty(reg.DisplayName))
                    {
                        ListReg.Add(reg);
                    }
                }
            }

            return ListReg;
        }
        #endregion

        #region 私有方法
        /// <summary>
        /// 获取注册表下的某一项的子项
        /// </summary>
        /// <returns>子项集合</returns>
        private static object[] GetSubKeys()
        {
            object[] result = null;

            dynamic RegMethod = ObjReg.Methods_("EnumKey"); //为Shell对象添加方法名称
            dynamic RegParam = RegMethod.InParameters.SpawnInstance_(); //为Shell对象添加参数
            RegParam.hDefKey = 0x80000002; //设置参数的主目录(HKLM)
            RegParam.sSubKeyName = HKey; //设置参数的子目录

            dynamic ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam); //执行方法且获取返回值
            if (ReturnParam.ReturnValue == 0) //操作正常
            {
                try
                {
                    result = (object[])ReturnParam.sNames; //获取子项集合
                }
                catch { }
            }
            return result;
        }
        /// <summary>
        /// 获取注册表对象
        /// </summary>
        /// <param name="SubKey">子项名称</param>
        /// <returns>注册表对象</returns>
        private static LocalRegistryModel DisposeSubKey(string SubKey)
        {
            LocalRegistryModel reg = new LocalRegistryModel(); //创建注册表对象

            dynamic RegMethod = ObjReg.Methods_("GetStringValue"); //为Shell对象添加方法名称
            dynamic RegParam = RegMethod.InParameters.SpawnInstance_(); //创建Shell对象的参数
            RegParam.hDefKey = 0x80000002; //设置参数的主目录(HKLM)
            RegParam.sSubKeyName = HKey + @"\" + SubKey; //设置参数的子目录

            reg.RegName = SubKey;

            RegParam.sValueName = "DisplayName"; //设置参数的子键名称
            dynamic ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam); //执行方法且获取返回值
            reg.DisplayName = Convert.ToString(ReturnParam.sValue);
            if (string.IsNullOrEmpty(reg.DisplayName))
            {
                return reg;
            }

            RegParam.sValueName = "DisplayVersion";
            ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam);
            reg.DisplayVersion = Convert.ToString(ReturnParam.sValue);

            RegParam.sValueName = "Publisher";
            ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam);
            reg.Publisher = Convert.ToString(ReturnParam.sValue);

            RegParam.sValueName = "InstallLocation";
            ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam);
            reg.InstallLocation = Convert.ToString(ReturnParam.sValue);

            RegParam.sValueName = "InstallDate";
            ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam);
            reg.InstallDate = Convert.ToString(ReturnParam.sValue);

            RegParam.sValueName = "DisplayIcon";
            ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam);
            reg.DisplayIcon = Convert.ToString(ReturnParam.sValue);

            RegParam.sValueName = "UninstallString";
            ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam);
            reg.UninstallString = Convert.ToString(ReturnParam.sValue);

            return reg;
        }
        #endregion
    }
}

6.新建Silverlight项目,添加ZKR.Silverlight.Core的引用;

7.xaml代码如下:

<navigation:Page x:Class="LogInfoTest.Software" 
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
           xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
           xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
           mc:Ignorable="d"
           xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
           d:DesignWidth="640" d:DesignHeight="480"
                 xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
           Title="Software Page">
    <Grid x:Name="LayoutRoot" Background="White">
        <TextBlock Text="获取本机已安装软件的列表" FontSize="12" VerticalAlignment="Top" Margin="0,5,0,0" HorizontalAlignment="Left" Width="150" Height="20"></TextBlock>
        <Button x:Name="btnLoad" Content="读取" Click="btnLoad_Click" Width="50" Height="25" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="160,3,0,0"></Button>
        <sdk:DataGrid Margin="0,34,0,0" x:Name="DataGrid1" AutoGenerateColumns="False">
            <sdk:DataGrid.Columns>
                <sdk:DataGridTextColumn Binding="{Binding RegName, Mode=TwoWay}" CanUserReorder="False" Header="注册表名称" IsReadOnly="True" />
                <sdk:DataGridTextColumn Binding="{Binding DisplayName, Mode=TwoWay}" CanUserReorder="False" Header="软件名称" IsReadOnly="True" />
                <sdk:DataGridTextColumn Binding="{Binding DisplayVersion, Mode=TwoWay}" CanUserReorder="False" Header="软件版本" IsReadOnly="True" />
                <sdk:DataGridTextColumn Binding="{Binding Publisher, Mode=TwoWay}" CanUserReorder="False" Header="发布者" IsReadOnly="True" />
                <sdk:DataGridTextColumn Binding="{Binding InstallLocation, Mode=TwoWay}" CanUserReorder="False" Header="安装目录" IsReadOnly="True" />
                <sdk:DataGridTextColumn Binding="{Binding InstallDate, Mode=TwoWay}" CanUserReorder="False" Header="安装时间" IsReadOnly="True" />
                <sdk:DataGridTextColumn Binding="{Binding DisplayIcon, Mode=TwoWay}" CanUserReorder="False" Header="运行路径" IsReadOnly="True" />
                <sdk:DataGridTextColumn Binding="{Binding UninstallString, Mode=TwoWay}" CanUserReorder="False" Header="卸载路径" IsReadOnly="True" />
                <sdk:DataGridTemplateColumn Header="操作">
                    <sdk:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <Button x:Name="btnRun" Content="运行" DataContext="{Binding DisplayIcon}" Click="btnRun_Click" />
                                <Button x:Uid="btnUninstall" Content="卸载" DataContext="{Binding UninstallString}" Click="btnUninstall_Click" Margin="5,0,0,0"/>
                            </StackPanel>
                        </DataTemplate>
                    </sdk:DataGridTemplateColumn.CellTemplate>
                </sdk:DataGridTemplateColumn>
            </sdk:DataGrid.Columns>
        </sdk:DataGrid>
    </Grid>
</navigation:Page>
8.xaml.cs代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Navigation;

using System.Runtime.InteropServices.Automation;
using ZKR.Silverlight.Core;
using System.Collections.ObjectModel;

namespace LogInfoTest
{
    public partial class Software : Page
    {
        public Software()
        {
            InitializeComponent();
        }

        // 当用户导航到此页面时执行。
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
        }

        private void btnLoad_Click(object sender, RoutedEventArgs e)
        {
            this.DataGrid1.ItemsSource = LocalMachine.GetInstallSoftware();
        }

        private void btnRun_Click(object sender, RoutedEventArgs e)
        {
            LocalMachine.RunApplication(((Button)sender).DataContext.ToString());
        }

        private void btnUninstall_Click(object sender, RoutedEventArgs e)
        {
            LocalMachine.UninstallApplication(((Button)sender).DataContext.ToString());
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
情况一及解决方法:   在升级silverlight 或者卸载的时候 提示找不到某个某个临时目录下的原始安装文件 从而无法卸载或升级新版本 微软公司真是没有考虑周全 谁会保存原始的临时文件目录 通常在某个temp目录中 中的原始安装包文件呢   这种错误会令人抓狂 不过 还是有解决方法的:   打开注册表工具regedit 在“开始 >运行”中执行命令regedit 找到路径 My Computer >   HKEY CLASSES ROOT > INSATLLER > PRODUCTS > {D7314F9862C648A4DB8BE2A5B47BE100} 然后删除它(注意 在删除注册表键值之前 请右键点击要删除的键值 通过导出功能来做备份 一旦删除之后发生问题 可以通过双击之前导出的注册表文件进行恢复) 退出注册表工具   再试试安装silverlight或升级 是否成功了 反正我是成功了 祝你也好运   情况二及解决方法:   如果在使用windows update更新时 发现某个更新总是安装失败 并且错误代码是643 那么通常都是由于该更新所对应的组件损坏 导致该更新无法安装成功 要解决这个问题 通常都需要将该组件卸载之后重新安装来进行修复 如果无法安装的更新是Microsoft Silverlight的更新 首先需要做好准备的是下载独立的Microsoft Silverlight安装包   方法一:下载Windows Installer clean up工具并安装 在开始菜单中打开它并找到与silverlight相关的项目 将其删除 完成后重新启动计算机 再次安装Microsoft Silverlight并尝试更新 ">情况一及解决方法:   在升级silverlight 或者卸载的时候 提示找不到某个某个临时目录下的原始安装文件 从而无法卸载或升级新版本 微软公司真是没有考虑周全 谁会保存原始的临时文件目录 通常在某个temp目录中 中 [更多]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值