• [C#][代码收集]


    [C# 操作注册表] [编辑]


    >> C#操作注册表的方法详解 - 作者:方倍

       01、准备工作

       02、注册表项的创建,打开与删除

       03、键值的创建(设置值、修改),读取和删除

       04、判断注册表项或者键值是否存在

       05、补充:x32软件在x64系统下操作注册表,会自动转向到Wow6432Node,为了控制不转向,使用以下代码 >

    >> [此处主目录2标题]

       01、 >

       02、 >

       03、 >

       04、 >

       05、 >

       06、 >

       07、 >

       08、 >

       09、 >

       10、 >


    >> C#操作注册表的方法详解 - 作者:方倍 目录

       01、准备工作 目录

    /*1. 要操作注册表,我们必须要引入必要的命名空间:
        在这个命名空间里面包含了许多注册表相关的类,足够我们使用了~~
    */
    
    using Microsoft.Win32;
    
    /*
       2. 命名空间里面提供了一个类:
          RegistryKey 利用它我们可以定位到注册表  
          最开头的分支:
          ClassesRoot,CurrentUser,Users,LocalMachine,CurrentConfig        
    */
    
    RegistryKey key = Registry.LocalMachine;
    
    /*
       3. 在操作的过程中涉及到子分支,要用\进行深入,单个会报错!
       4. 最后要调用RegistryKey对象的Close()关闭对注册表的修改~~~
       5. 以下我们的例子都是在LocalMachine分支下,请注意。 
    */
    查看代码 

       02、注册表项的创建,打开与删除 目录

    /*1. 创建
           创建注册表项主要用到RegistryKey 的CreateSubKey()方法。
           如:
           在HKEY_LOCAL_MACHINESOFTWARE下新建名为test的注册表项。
           如果已经存在则不影响!
    */
    RegistryKey key = Registry.LocalMachine;
    RegistryKey software = key.CreateSubKey("software\test");
    
    /*2. 打开
           打开注册表项主要用到RegistryKey 的OpenSubKey()方法。
           如:
           注意:如果该注册表项不存在,这调用这个方法会抛出异常
           注意:该方法后面还可以有一个布尔型的参数,true表示可以写入。   
    */
    RegistryKey key = Registry.LocalMachine;
    RegistryKey software = key.OpenSubKey("software\test",true);
    
    /*3. 删除
           删除注册表项主要用到RegistryKey 的DeleteSubKey()方法。
           如:
           注意,如果该注册表项不存在,这调用这个方法会抛出异常
    */
    RegistryKey key = Registry.LocalMachine;
    //该方法无返回值,直接调用即可
    key.DeleteSubKey("software\test",true); 
    key.Close();
    查看代码 

       03、键值的创建(设置值、修改),读取和删除 目录

    /*1.创建(设置值、修改)
        对键值的创建修改等操作主要用到RegistryKey 的SetValue()方法
        如:
        在HKEY_LOCAL_MACHINESOFTWARE	est下创建一个名为“test”,值为“脚本之家”的键值。如果该键值原本已经存在,则会修改替换原来的键值,如果不存在则是创建该键值。
    */
    RegistryKey key = Registry.LocalMachine;
    RegistryKey software = key.OpenSubKey("software\test",true); //该项必须已存在
    software.SetValue("test", "脚本之家");
    // 注意:SetValue()还有第三个参数,主要是用于设置键值的类型,如:字符串,二进制,Dword等等~~默认是字符串。如:
    // software.SetValue("test", "0", RegistryValueKind.DWord); //二进制信息
    Key.Close();
    
    /*2.读取
        如:
        读取 HKEY_LOCAL_MACHINESOFTWARE	est下名为“test”的键值
        info结果为:脚本之家
    */
    string info = "";
    RegistryKey Key;
    Key = Registry.LocalMachine;
    myreg = Key.OpenSubKey("software\test");
    // myreg = Key.OpenSubKey("software\test",true);
    info = myreg.GetValue("test").ToString();
    myreg.Close();
    
    /*3.删除
        如:
        
    */
    RegistryKey delKey = Registry.LocalMachine.OpenSubKey("Software\test", true);
    delKey.DeleteValue("test");
    delKey.Close();
    
    /*
    细心的读者可能发现了第二个例子中OpenSubKey()方法参数与其他例子的不同。
    如果你要修改键值,包括创建、设置、删除键值等都要在方法后面加个布尔参数,设置为true,表示可写可改;如果仅仅只是读取键值可以不加,此时可写关闭,你不能再往里写值(当然,你要加也可以true)!
    还有读者提到读写默认键值的问题,主要在设置、读取的方法中将键名置空则就是对默认键值的操作。
    如:
    复制代码 代码如下:
    software.SetValue("", "脚本之家"); // 在HKEY_LOCAL_MACHINESOFTWARE	est修改默认键值的值为“脚本之家”。读取类似!
    
    另外,默认的键值是不能删除的,所以不要用DeleteValue()方法去删除,会抛出异常的!
    */
    查看代码

       04、判断注册表项或者键值是否存在 目录

    // 判断注册表项是否存在
    private bool IsRegeditItemExist() 
    { 
        string [] subkeyNames; 
        RegistryKey hkml = Registry.LocalMachine; 
        RegistryKey software = hkml.OpenSubKey("SOFTWARE"); 
        //RegistryKey software = hkml.OpenSubKey("SOFTWARE", true); 
        subkeyNames = software.GetSubKeyNames(); //取得该项下所有子项的名称的序列,并传递给预定的数组中 
        
        foreach (string keyName in subkeyNames)  //遍历整个数组     
        { 
            if (keyName == "test") //判断子项的名称         
            {  
              hkml.Close(); 
              return true ; 
            } 
        } 
        hkml.Close(); 
        return false;  
    }
    
    // 判断键值是否存在
    private bool IsRegeditKeyExit()
    {
        string[] subkeyNames;
        RegistryKey hkml = Registry.LocalMachine;
        RegistryKey software = hkml.OpenSubKey("SOFTWARE\test");
        //RegistryKey software = hkml.OpenSubKey("SOFTWARE\test", true);
        subkeyNames = software.GetValueNames(); //取得该项下所有键值的名称的序列,并传递给预定的数组中
        foreach (string keyName in subkeyNames)
        {
            if (keyName == "test") //判断键值的名称
            {
                hkml.Close();
                return true;
            }
        }
        hkml.Close();
        return false;
    }
    查看代码 

       05、补充:x32软件在x64系统下操作注册表,会自动转向到Wow6432Node,为了控制不转向,使用以下代码 目录

    // 补充:x32软件在x64系统下操作注册表,会自动转向到Wow6432Node,为了控制不转向,使用以下代码:
    /// <summary>
    /// 获得根节点的句柄,常数是固定的
    /// </summary>
    /// <param name="hive"></param>
    /// <returns></returns>
    public static IntPtr GetHiveHandle(RegistryHive hive)
    {
        IntPtr preexistingHandle = IntPtr.Zero;
        IntPtr HKEY_CLASSES_ROOT = new IntPtr(-2147483648);
        IntPtr HKEY_CURRENT_USER = new IntPtr(-2147483647);
        IntPtr HKEY_LOCAL_MACHINE = new IntPtr(-2147483646);
        IntPtr HKEY_USERS = new IntPtr(-2147483645);
        IntPtr HKEY_PERFORMANCE_DATA = new IntPtr(-2147483644);
        IntPtr HKEY_CURRENT_CONFIG = new IntPtr(-2147483643);
        IntPtr HKEY_DYN_DATA = new IntPtr(-2147483642);
        
        switch (hive)
        {
            case RegistryHive.ClassesRoot: preexistingHandle = HKEY_CLASSES_ROOT; break;
            case RegistryHive.CurrentUser: preexistingHandle = HKEY_CURRENT_USER; break;
            case RegistryHive.LocalMachine: preexistingHandle = HKEY_LOCAL_MACHINE; break;
            case RegistryHive.Users: preexistingHandle = HKEY_USERS; break;
            case RegistryHive.PerformanceData: preexistingHandle = HKEY_PERFORMANCE_DATA; break;
            case RegistryHive.CurrentConfig: preexistingHandle = HKEY_CURRENT_CONFIG; break;
            case RegistryHive.DynData: preexistingHandle = HKEY_DYN_DATA; break;
        }
        
        return preexistingHandle;
    }
    
    // 使用:
    /// <summary>
    /// 操作注册表
    /// </summary>
    /// <param name="hive">根级别的名称</param>
    /// <param name="path">不包括根级别的名称</param>
    /// <param name="parameters">项/(值/值类型) 参数</param>
    /// <param name="view">注册表视图</param>
    [RegistryPermissionAttribute(SecurityAction.LinkDemand, Unrestricted = true)]
    public static void OperateReg(RegistryHive hive, string path, Dictionary<string, string[]> parameters, RegistryView view)
    {
        SafeRegistryHandle handle = new SafeRegistryHandle(GetHiveHandle(hive), true);
        RegistryKey r = RegistryKey.FromHandle(handle, view).CreateSubKey(path, RegistryKeyPermissionCheck.ReadWriteSubTree);
        //一般情况是使用如下代码:
        //RegistryKey rk = Registry.LocalMachine.CreateSubKey(path);
        if(parameters == null && parameters.Count <= 0)
        return;
    
        List<string> keys = parameters.Keys.ToList();
        for (int i = 0; i < parameters.Count; i++)
        {  
            //string to RegistryValueKind
            RegistryValueKind rv = (RegistryValueKind)Enum.Parse(typeof(RegistryValueKind), parameters[keys[i]][1].ToString(), true);
            r.SetValue(keys[i], parameters[keys[i]][0], rv);
        }
    }
    
    // 例子:
    public static void RegisterScreenCapture(string targetDir, string guid, bool is64BitLync)
    {
        if(string.IsNullOrEmpty(guid))
        guid = "{541a4dc3-50dc-4b4f-a38d-0ed1d360ca6b}";
        Dictionary<string, string[]> paraCapture = new Dictionary<string, string[]>();
        paraCapture["Name"] = new string[]{"ScreenCapture",RegistryValueKind.String.ToString()};
        paraCapture["Path"] = new string[]{string.Format("{0}IcoLync.ScreenCapture.exe", targetDir),RegistryValueKind.String.ToString()};
        paraCapture["Extensiblemenu"] = new string[]{ "ConversationWindowActions",RegistryValueKind.String.ToString()};
        paraCapture["SessionType"] = new string[]{ "0",RegistryValueKind.DWord.ToString()};
        RegistryView rv;
        if(is64BitLync)
        {
            rv = RegistryView.Registry64;
        }
        else
        {
            rv = RegistryView.Default;
        }
        
        OperateReg(RegistryHive.LocalMachine, string.Format(@"SOFTWAREMicrosoftOffice15.0LyncSessionManagerApps{0}", guid), paraCapture, rv);
    }
    
    /*
    刚才经过测试,不需要GetHiveHandl()也行(我也不知道什么需要); OperateReg()方法中一二行代码改为
    复制代码 代码如下:
    */
    RegistryKey r = RegistryKey.OpenBaseKey(hive, view).CreateSubKey(path, RegistryKeyPermissionCheck.ReadWriteSubTree);
    查看代码 

    >> [此处主目录2标题] 目录

       01、目录

     

       02、目录

     

       03、目录

     

       04、目录

     

       05、目录

     

       06、目录

     

       07、目录

     

       08、目录

     

       09、目录

     

       10、目录

     
    博客标明【原创】的文章都是本人亲自编写内容! 如有需要转载, 请标明出处:辉创1989(http://www.cnblogs.com/ahui1989/),届时非常感谢! 文章分享在此,希望我之原创有帮到你们! 如有不足之处也可联系我,以便我们共同探讨! 本人现职为Epicor10 系统 开发维护工作,如有需要可共同探讨相关技术知识及经验总结! QQ:929412592
  • 相关阅读:
    237. Delete Node in a Linked List
    430. Flatten a Multilevel Doubly Linked List
    707. Design Linked List
    83. Remove Duplicates from Sorted List
    160. Intersection of Two Linked Lists
    426. Convert Binary Search Tree to Sorted Doubly Linked List
    142. Linked List Cycle II
    类之间的关系
    初始化块
    明确类和对象
  • 原文地址:https://www.cnblogs.com/ahui1989/p/7675820.html
Copyright © 2020-2023  润新知