某些程序必须依赖指定运行环境。那么读取注册表来判断此电脑是否有执行环境是个很不错的办法。因为每个软件安装之后都会在注册表中注册对应的键值,并且有些键值是独一无二的。
那么首先就需要找到那个具体的独一无二的键值,以便程序在运行之前能够去读取以判断。
代码如下:
class Program
{
private static string _sValue = string.Empty;
static void Main(string[] args)
{
Console.WriteLine("请输入待查找值:");
_sValue = Console.ReadLine();
Console.WriteLine($"正在查询。。。");
var registryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,
Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32); //判断机器位数
int i = 0;
GetKeyNames(registryKey, ref i);
Console.WriteLine($"查询结束。。。");
Console.ReadKey();
}
/// <summary>
/// 遍历所有子项
/// </summary>
/// <param name="subkey">节点</param>
/// <param name="i"></param>
private static void GetKeyNames(RegistryKey subkey, ref int i)
{
foreach (var subkey_name in subkey.GetSubKeyNames()) // 检索包含所有子项名称的字符串数组
{
try
{
using (RegistryKey csubkey = subkey.OpenSubKey(subkey_name))
{
GetValueName(csubkey, ref i);
GetKeyNames(csubkey, ref i);
}
}
catch { }
}
}
/// <summary>
/// 若包含输入值则输出记录
/// </summary>
/// <param name="subkey">节点</param>
/// <param name="i"></param>
private static void GetValueName(RegistryKey subkey, ref int i)
{
foreach (var name in subkey.GetValueNames()) //检索包含与此项关联的所有值名称的字符串数组
{
var sValue = subkey.GetValue(name) + string.Empty;
if (string.Compare(sValue, string.Format(@"{0}", _sValue, StringComparison.OrdinalIgnoreCase)) == 0)
{
Console.WriteLine(++i + "\t" + subkey.Name);
}
}
}
}
现在查找含有E:\ArcGIS\Python27\ArcGISx6410.2\python.exe的键:
结果如下:
补充知识:利用C#访问注册表获取软件的安装路径
绝大多数软件,基本上都会在注册表中记录自己的名字和安装路径信息。
在注册表中记录这些信息的位置是:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
因此,我们只要能访问到注册表的这个位置,就可以获取到某些软件的名称和安装路径信息。
本博文使用C#访问注册表获取软件的安装路径并进行显示。
1 示例程序主画面说明
示例程序主画面如下图所示。
在画面中的文本框中输入可执行程序的名称,点击“获取路径”按钮,便会在画面中的下一行(“获取路径”按钮所在行的下一行)显示出该程序完整的安装路径信息。
这里输入的可执行文件名称必须是程序在注册表中的名称,如Adobe Reader在注册表中的名称为“AcroRd32.exe”。
2 示例程序完整代码
using System;
using System.Windows.Forms;
using Microsoft.Win32;
namespace GetSoftWarePathExp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
try
{
string softName = textBox1.Text.ToString();
string strKeyName = string.Empty;
string softPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\";
RegistryKey regKey = Registry.LocalMachine;
RegistryKey regSubKey = regKey.OpenSubKey(softPath + softName + ".exe", false);
object objResult = regSubKey.GetValue(strKeyName);
RegistryValueKind regValueKind = regSubKey.GetValueKind(strKeyName);
if (regValueKind == Microsoft.Win32.RegistryValueKind.String)
{
this.label3.Text = objResult.ToString();
}
}
catch
{
this.label3.Text = "朋友,获取程序路径失败!";
}
}
}
}
注意:需要添加引用:using Microsoft.Win32;
3 代码说明
(1)代码“RegistryKey regKey = Registry.LocalMachine”使regKey 指向注册表主键HKEY_LOCAL_MACHINE。
(2)代码“RegistryKey regSubKey = regKey.OpenSubKey(softPath + softName + ".exe", false)”使regSubKey 指向我们需要查找的注册表子健。
(3)代码“object objResult = regSubKey.GetValue(strKeyName)”获取注册表的键值。
(4)代码“RegistryValueKind regValueKind = regSubKey.GetValueKind(strKeyName)”获取注册表的键值类型。
(5)最后输出获取到的键值信息。
(6)程序若出错,输出“朋友,获取程序路径失败!”的提示信息。
注意:RegistryKey.GetValue和RegistryKey.GetValueKind方法均需要传入一个参数指示要检索的值的名称,当传递给RegistryKey.GetValue和RegistryKey.GetValueKind方法的参数为一个空字符串时,则检索的是一个未命名的值,在注册表编辑器中显示此未命名的值时,将显示字符串“(Default)”,而不是显示一个名称。
在本例中,传入的就是一个空字符串,若以检索软件Adobe Reader的安装信息为例,则获取的是下图中的第一条注册表信息,此时名称项显示字符串“(默认)”。
4 程序运行结果
(1)获取Adobe Reader的安装路径
输入“AcroRd32”,点击“获取路径”,得到以下结果,是不是和注册表中记录的信息一致啊。
(2)获取chrome的安装路径
输入“chrome”,点击“获取路径”,得到以下结果,是不是和注册表中记录的信息一致啊。
5 多说两句
在开发中,有时会指定特定程序来执行某类操作,这时可能会涉及读取注册表信息来打开程序。只是有些程序可能不存在这样的注册信息,这时,我们就必须采取其他方式了。
以上这篇C#获取注册表指定键值操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。
您可能感兴趣的文章:如何在C#中使用注册表C#设置自定义文件图标实现双击启动(修改注册表)C#设置软件开机自动运行的方法(修改注册表)C#操作注册表的方法详解C#实现读取注册表监控当前操作系统已安装软件变化的方法C#通过windows注册表获取软件清单的方法C#操作windows注册表的方法c#注册表操作类分享C#操作注册表的方法