前面貼出了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());
}
}
}