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

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

代码如下:

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 多说两句

在开发中,有时会指定特定程序来执行某类python基础教程操作,这时可能会涉及读取注册表信息来打开程序。只是有些程序可能不存在这样的注册信息,这时,我们就必须采取其他方式了。

C#获取注册表指定键值操作相关推荐

  1. C#获取注册表指定键值

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

  2. java读取注册表_Java通过CMD方式读取注册表任意键值对代码实践

    需要读取如图所示注册表[HKEY_LOCAL_MACHINE\SOFTWARE\EasyDrv7]节点下的[DateTime]的值 直接上代码: package com.beibei.common.u ...

  3. 注册表各键值保存的内容及其对用的作用(功能)(不完善,有补充的评论指出供大家学习参考)

    从Windows 95开始,Microsoft在Windows中引入了注册表(英文为REGISTRY)的概念(实际上原来在Windows NT中已有此概念).注册表是Windows 95及Window ...

  4. # 删除注册表项键值_强制删除:让你的电脑上不再有“顽固”程序

    微信搜一搜麦克NO1对于很多用户来说,在日常使用电脑的时候,经常会有意无意的安装一些程序.而这些程序也是严重影响了电脑的运行速度.所以,在忍无可忍的情况下,需要将这些"顽固"程序卸 ...

  5. [C++]用VC++来设置获得注册表的键值(问题解决)

    下面这个是基于MFC的基本对话写的..  演示设置注册表的3中类型的值和获得注册表的3中类型的值.. 分别用RegSetValueEx()来设置,RegQueryValueEx()函数来获得. voi ...

  6. js读取注册表的键值

    try { var shell = new ActiveXObject("WScript.Shell"); --读取注册表 var  key  = shell.RegRead(&q ...

  7. windows注册表几大键值

    什么是注册表?  从Windows 95开始,Microsoft在Windows中引入了注册表(英文为REGISTRY)的概念(实际上原来在Windows NT中已有此概念).注册表是Windows ...

  8. 批量删除注册表特定键值的小技巧

    今天使用虚拟机的时候发现了一个小的问题,我的ubunto需要使用18.04,但是我用的虚拟机是版本12的,不能正常加载,但是在别人的电脑上就能成功,看他们的版本是15.0的所以我也想吧我的虚拟机升级到 ...

  9. 梳理注册表的一些危险操作,注册表的安全配置,以及对于注册表的总结

    本次文章为大家梳理一些注册表常见的危险操作,希望可以帮大家规避一些在日常使用中可能会遇到的问题. 映象劫持IFEO(Image File Execution Options) 在低版本的windows ...

  10. java获取mysql表的主键_Spring中获取数据库表主键序列

    在程序开发中,我们经常有写数据库表的操作,数据表中经常带有主键自增序列,如何获取自增序列.spring中提供了相应的类 DataFieldMaxValueIncrementer. DataFieldM ...

最新文章

  1. 命令行下的FTP使用详解
  2. 爬虫抓取糯米网上所有商家数据
  3. spark shell中编写WordCount程序
  4. 【网络】tcp三次握手协议
  5. nginx 1.11.0实现http和https正向代理
  6. Linux下汇编语言学习笔记51 ---
  7. 信息安全等级保护工作概述
  8. 数据库系统教程第三版施伯乐
  9. shell脚本——系统工具箱(SystemToolbox)
  10. HTTP 412状态码
  11. ODM、JDM、OEM、OBM
  12. python中的scaler_【笔记】scikit-learn中的Scaler(归一化)
  13. Switch 开关,将字写在滑块上面
  14. http POST请求键值对参数以及json参数
  15. 1刷黑群晖_当苹果用户拥有NAS后可以做什么?群晖DS220J体验测评
  16. WCF 之 什么是WCF
  17. Oracle中日期函数的使用
  18. 2020.5.12第一次博客
  19. 详谈什么是接口测试?
  20. 急 急 急 急!!!!!!!!!

热门文章

  1. 什么是需求跟踪矩阵RTM
  2. elk logstach收集交换机日志
  3. 一个简易的QQ魔法卡片炼卡消耗计算器
  4. Windows快捷键使用和打开CMD的方式
  5. 如何轻松集成VARCHART XGantt
  6. LibFetion 应用程序
  7. 四川省大学生金融科技建模大赛-模型复现和点评
  8. SPDY, WebSocket, WebDAV概念
  9. flv 文件格式详解
  10. 直博人数远大于硕士人数,清华计算机系到底有多强?