【语言-c#】C# 遍历注册表

public class Helper
{
    /// <summary>
    /// 搜索与指定(值)名称匹配的全路径
    /// </summary>
    /// <param name="path">起始路径(节点)</param>
    /// <param name="value">用于查找的(值)名称</param>
    /// <param name="bAll">是否搜索起始路径(节点)全部节点</param>
    /// <returns></returns>
    public static List<string> RegeditFindFullPath(string path, string value,bool bAll = false)
    {
        try
        {
            Microsoft.Win32.RegistryKey hklm = Microsoft.Win32.Registry.LocalMachine;
            Microsoft.Win32.RegistryKey system = hklm.OpenSubKey(path);//不区分大小写
            List<string> paths = new List<string>();
            paths.Add("HKEY_LOCAL_MACHINE");
            paths.Add(path);
            List<string> output = new List<string>();
            RegeditFindFullPath(system, value, ref paths, ref output, bAll);
            return output;
        }
        catch(Exception exp)
        {
            return new List<string>();
        }
    }
    /// <summary>
    /// 是否搜索起始路径(节点)全部路径
    /// </summary>
    /// <param name="SubkeyName">节点名称</param>
    /// <param name="layer">第几层</param>
    /// <param name="bAll">是否搜索起始路径(节点)全部节点</param>
    /// <returns></returns>
    private static bool Check(string SubkeyName, int layer, bool bAll = false)
    {
        if (bAll) return true;
        if (layer == 2 && SubkeyName.ToLower().Contains("controlset") == false)
        {
            return false;
        }
        if (layer == 3 && SubkeyName.ToLower() != "enum" && SubkeyName.ToLower() != "control")
        {
            return false;
        }
        if (layer == 4 && SubkeyName.ToLower() != "display" && SubkeyName.ToLower() != "graphicsdrivers")
        {
            return false;
        }
        return true;
    }
    /// <summary>
    /// 递归 - 搜索与指定(值)名称匹配的全路径
    /// </summary>
    /// <param name="parent">注册表节点</param>
    /// <param name="value">用于查找的(值)名称</param>
    /// <param name="path">记录路径</param>
    /// <param name="output">记录符合的全路径</param>
    /// <param name="bAll">是否搜索起始路径(节点)全部节点</param>
    private static void RegeditFindFullPath(Microsoft.Win32.RegistryKey parent, string value, ref List<string> path, ref List<string> output, bool bAll = false)
    {
        try
        {
            string fullpath = string.Join("\\", path.ToArray());
            foreach (string valuesName in parent.GetValueNames())
            { 
            if(value == valuesName)
            {
                output.Add(fullpath);
            }
            }
            foreach (string SubkeyName in parent.GetSubKeyNames())
            {
                if (Check(SubkeyName, path.Count, bAll) == false) continue;

                Microsoft.Win32.RegistryKey Subkey = parent.OpenSubKey(SubkeyName);
                if(Subkey!=null)
                {
                path.Add(SubkeyName);
                RegeditFindFullPath(Subkey, value, ref path, ref output, bAll);
                path.RemoveAt(path.Count -1);
                }
            }
        }
        catch (Exception exp)
        {
              
        }
    }
    /// <summary>
    /// 以监视器的注册信息为例
    /// </summary>
    /// <param name="bAllRegEdit">是否搜索起始路径(节点)全部节点</param>
    /// <returns></returns>
    public static string DesktopMonitor(bool bAllRegEdit = false)
    {
        try
        {
            string info = "";
            List<string> PATHS = RegeditFindFullPath("SYSTEM", "EDID", bAllRegEdit);
            Microsoft.Win32.RegistryKey hklm = Microsoft.Win32.Registry.LocalMachine;
            foreach (var path in PATHS)
            {
                Microsoft.Win32.RegistryKey Subkey = hklm.OpenSubKey(path.Remove(0, "HKEY_LOCAL_MACHINE\\".Length));
                if(Subkey!=null)
                {
                    byte[] bytes = (byte[])Subkey.GetValue("EDID");
                    string infoitem = SMQHDesktopMonitor.CEDID.Information(bytes);
                    if (info.Contains(infoitem) == false)
                    {
                        info += string.Format("注册表路径 [计算机\\{0}] EDID\r\n显示器信息  {1}\r\n\r\n", path, infoitem);
                    }
                }
            }
                
            return info;
        }
        catch(Exception exp)
        {
            return exp.Message;
        }
    }
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值