LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

c#怎么循环读取注册表某目录下所有的子键/字符串值名称

admin
2021年2月16日 22:36 本文热度 3759
获取下面所有字符串值:
private void button1_Click(object sender, EventArgs e)
{
    RegistryKey rk = Registry.CurrentUser.OpenSubKey("SOFTWARE\\MICROSOFT\\INTERNET EXPLORER\\MAIN");
    if(rk != null)
    {
        foreach (string vname in rk.GetValueNames())
        {
            if (rk.GetValueKind(vname) == RegistryValueKind.String)  //这里判断类型RegistryValueKind.DWord
            {
                Text1.Text = Text1.Text + "\r\n" + vname + ":" + rk.GetValue(vname);
            }
        }
        rk.Close();
    }
}

获取下面所有子键值:
public static bool IsAisino()
{
    bool IsAisino = false;
    //获取注册表路径
    RegeditKey regeditKey = TaxSoftwareBaseInfo.GetRealyTrueRegeditPath(WindowsInfo.GetWindowsVersion());
    RegistryKey regSubKey = null;
    //获取驱动路径
    regSubKey = regeditKey.Registry.OpenSubKey(@"System\CurrentControlSet\Control\Print\Printers\", false);
    string[] rk = regSubKey.GetSubKeyNames();
    foreach (var item in rk)
    {
        //这里就是要判断读取注册表的值
    }
}

该文章在 2021/2/18 15:34:33 编辑过

全部评论1

admin
2021年2月16日 22:46
 

C#操作注册表REG_DWORD类型键异常(RegistryValueKind.DWord异常)解决方案


         在用C#操作注册表时,如果注册表键的类型是REG_DWORD,有可能遇到溢出BUG。网上这方面的资料很少,在这共享一下。

         C#可以用RegistryKey类的SetValue方法来设置键值,例如:



         看起来一切正常,但是这个RegistryValueKind.DWord是有问题的。

         注册表中的REG_DWORD是无符号32位数值,而C#中的RegistryValueKind.DWord是有符号32位数值。这就意味着RegistryValueKind.DWord的表示范围比REG_DWORD小,因此导致直接传入一些大数时会抛出异常提示类型不正确。

         那么如何解决这个BUG呢?

         读者可能试图这样做:

         openKey.SetValue("NoViewOnDrive",Convert.ToInt32("ffffffff",16), RegistryValueKind.DWord);

         目的是强制把参数转换成32位有符号数,这样是不行的,同样提示异常,因为ffffffff已经超出了有符号32位数的表示范围,无法转换。

         或者这样做:

         openKey.SetValue("NoViewOnDrive",Convert.ToUInt32 ("ffffffff",16), RegistryValueKind.DWord);

         目的是把参数强制转换成无符号32位表示,这样同样不行,SetValue方法内部会自动把参数转换成有符号32位表示,因此,我们的转换是徒劳的,还会被转换回去,而转换回去后,又会提示超出范围。

         其实,解决这个问题的方法很简单,只要把转换过程放在unchecked语句里就行了,unchecked语句块内的转换,不做溢出检查,溢出了直接用补码表示。例如:

1.  Int32 tempInt = 0; //预先定义一个有符号32位数

3.  //unchecked语句块内的转换,不做溢出检查

4.  unchecked

5.  {

6.      tempInt = Convert.ToInt32("ffffffff", 16); //强制转换成有符号32位数

7.  }

9.  //此时的tempInt已经是有符号32位数,可以直接写入注册表

10openKey.SetValue("NoViewOnDrive", tempInt, RegistryValueKind.DWord);


         这样转折一下,就可以成功写入注册表了。

该评论在 2021/2/16 22:46:06 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved