C#获取注册表指定键值操作

某些程序必须依赖指定运行环境。那么读取注册表来判断此电脑是否有执行环境是个很不错的办法。因为每个软件安装之后都会在注册表中注册对应的键值,并且有些键值是独一无二的。

那么首先就需要找到那个具体的独一无二的键值,以便程序在运行之前能够去读取以判断。

代码如下:

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#获取注册表指定键值操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C#设置软件开机自动运行的方法(修改注册表)

    本文实例讲述了C#设置软件开机自动运行的方法.分享给大家供大家参考,具体如下: #region /// <summary> /// 开机启动项 /// </summary> /// <param name="Started">是否启动</param> /// <param name="name">启动值的名称</param> /// <param name="path"

  • C#实现读取注册表监控当前操作系统已安装软件变化的方法

    本文实例讲述了C#实现读取注册表监控当前操作系统已安装软件变化的方法.分享给大家供大家参考.具体实现方法如下: private static HybridDictionary GetSoftName() { string strSoftName = string.Empty; HybridDictionary hdSoftName = new HybridDictionary(); /*对注册表节点"Software/Microsoft/Windows/CurrentVersion/Uninst

  • 使用C#在注册表中保存信息的例子

    写出来,方便记忆,以后要用,可以直接改改就能用. 复制代码 代码如下: using System; namespace Backend{    public class RegistryStorage    {        public static PageVisibility OpenAfterStart()        {            Microsoft.Win32.RegistryKey registryKey;            PageVisibility visi

  • C#操作注册表的方法详解

    本文实例讲述了C#操作注册表的方法.分享给大家供大家参考,具体如下: 下面我们就来用.NET下托管语言C#注册表操作,主要内容包括:注册表项的创建,打开与删除.键值的创建(设置值.修改),读取和删除.判断注册表项是否存在.判断键值是否存在. 准备工作: 1. 要操作注册表,我们必须要引入必要的命名空间: 复制代码 代码如下: using Microsoft.Win32; 在这个命名空间里面包含了许多注册表相关的类,足够我们使用了~~ 2. 命名空间里面提供了一个类:RegistryKey 利用它

  • C#设置自定义文件图标实现双击启动(修改注册表)

    程序生成的自定义文件,比如后缀是.test 这种文件怎么直接启动打开程序,并打开本文件呢 1.双击打开 2.自定义的文件,有图标显示 3.自定义的文件,点击右键有相应的属性 后台代码:(如何在注册表中修改信息) //工具启动路径 string toolPath = System.Windows.Forms.Application.StartupPath + "\\邮件小工具.exe"; string extension = SptdConst.FileExtension; string

  • C#通过windows注册表获取软件清单的方法

    本文实例讲述了C#通过windows注册表获取软件清单的方法.分享给大家供大家参考.具体如下: foreach (string SoftwareName in Object.SoftwareList()) { textBox.Text += SoftwareName + Environment.NewLine; } //////////////////////////////////////////////////////////////////////// /// <summary> ///

  • C#操作windows注册表的方法

    本文实例讲述了C#操作windows注册表的方法.分享给大家供大家参考.具体如下: 此代码演示了如何读取和写入注册表 读取注册表: private string GetRegistShellData(string RegistName) { try { string registData, SubregistData; RegistryKey hkml = Registry.LocalMachine; RegistryKey software = hkml.OpenSubKey(@"SOFTWA

  • C#获取注册表指定键值操作

    某些程序必须依赖指定运行环境.那么读取注册表来判断此电脑是否有执行环境是个很不错的办法.因为每个软件安装之后都会在注册表中注册对应的键值,并且有些键值是独一无二的. 那么首先就需要找到那个具体的独一无二的键值,以便程序在运行之前能够去读取以判断. 代码如下: class Program { private static string _sValue = string.Empty; static void Main(string[] args) { Console.WriteLine("请输入待查

  • Java通过CMD方式读取注册表任意键值对代码实践

    需要读取如图所示注册表[HKEY_LOCAL_MACHINE\SOFTWARE\EasyDrv7]节点下的[DateTime]的值 直接上代码: package com.beibei.common.util.cmd; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map;

  • js读取注册表的键值示例

    复制代码 代码如下: <span style="font-size:18px">try { var shell = new ActiveXObject("WScript.Shell"); --读取注册表 var key = shell.RegRead("HKEY_CURRENT_USER\\Software\\AC3Filter\\equalizer\\Linear scale\\eq_freq_0"); -- 删除注册表 shell

  • 使用JavaScript获取Django模板指定键值数据

    Django中利用js来操作数据的常规操作一般为点(.)操作符来获取字典或列表的数据,一般如{{data.0}},{{data.arg}} 但有时如果数据是嵌套类型的数据时,直接获取某个值就变得困难了,比如下面的格式要获取 correct中qxl的值 startArgsSet={"correct":{"qxl":0,"kkx":0},"reliable":{"qxl":0,"kkx":0

  • 利用InstallShield获取注册表键值的脚本

    Use  nvType = REGDB_NUMBER;  szKey = "\\SYSTEM\\CurrentControlSet\\Servic  es\\{58ECC408-265E-4342-9DA4-70BF1796D81D}\\Parameters\\Tcpip";  szName = "EnableDHCP"  RegDBSetDefaultRoot ( HKEY_LOCAL_MACHINE );  RegDBGetKeyvalueEx ( szKey,

  • Java Redis Template批量查询指定键值对的实现

    目录 一.Redis使用pipeline批量查询所有键值对 二.批量获取指定的键值对列表 一.Redis使用pipeline批量查询所有键值对 一次性获取所有键值对的方式: private RedisTemplate redisTemplate; @SuppressWarnings({ "rawtypes", "unchecked" })     public List executePipelined(Collection<String> keySet

  • PHP7.1方括号数组符号多值复制及指定键值赋值用法分析

    本文实例讲述了PHP7.1方括号数组符号多值复制及指定键值赋值用法.分享给大家供大家参考,具体如下: PHPer 们可能都知道 list 的用法,简单来说就是可以在一个表达试里通过数组对多个变量赋值: $values = array('value1', 'value2'); $list($v1, $v2) = $values; 感觉是不是很方便呢?在 PHP 7.1 中,还能更省事儿: [$v1, $v2] = ['foo', 'bar']; 这还不是最给力的,在 PHP 7.1 里我们还可以指

  • 我教你学之注册表子键

    了解过根键,让我们再来看看Windows XP根键下的主要子键吧.在这里,我们主要介绍一些对系统外观.界面.用户功能.应用软件等有影响,也就是用户希望自定义.清理.设置注册表的主要修改项. 位于根键HKEY_CURRENT_USER下的: (注:以下子键在HKEY_USERS/.DEFAULT下也有,两者的含义功能相同,只是HKEY_CURRENT_USER下的设置用于当前登录用户,即在个人电脑上多为计算机管理员,而HKEY_USERS/.DEFAULT下的设置用于其他用户.) AppEvent

  • JS实现从对象获取对象中单个键值的方法示例

    本文实例讲述了JS实现从对象获取对象中单个键值的方法.分享给大家供大家参考,具体如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>www.jb51.net JS获取对象中单个键值</title> </head> <body> <script> window.onl

  • php自定义排序uasort函数示例【二维数组按指定键值排序】

    本文实例讲述了php自定义排序uasort函数.分享给大家供大家参考,具体如下: 项目需要风险排序,按 I(安全)<L(低风险)<M(中风险)<H(高风险) 的级别来排序 由于H排在I的前面,所以不能直接用sort来排序,要自定义. 用uasort()函数来自定义排序: /* * 二维数组按指定键值排须 */ function arr_sort($array,$key,$order="asc"){//asc是升序 desc是降序//按 I<L<M<H

随机推荐