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());
        }
    }
}

 

發佈了11 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章