C#注册表技术及操作

news2024/11/20 0:01:49

目录

一、注册表基础

1.Registry和RegistryKey类 

(1)Registry类

(2)RegistryKey类

二、在C#中操作注册表

1.读取注册表中的信息 

(1)OpenSubKey()方法

(2)GetSubKeyNames()方法

(3)GetValueNames()方法

2.创建和修改注册表信息

(1)创建注册表信息

(2)修改注册表信息

3.删除注册表中的信息

(1)DeleteSubKey()方法

(2)DeleteSubKeyTree方法

(3)DeleteValue()方法 


        注册表是一个庞大的数据库系统,它记录了用户安装在计算机上的软件、硬件信息和每一个程序的相互关系。注册表中存放着很多参数,直接控制着整个系统的启动、硬件驱动程序的装载以及应用程序的运行。

        由于Windows 10系统本身的安全性问题,使用C#操作注册表时,可能会提示无法操作相应的注册表项,这时只需要为提示的注册表项添加everyone用户的读写权限即可

一、注册表基础

        Windows注册表包含Windows安装、用户喜好以及已安装软件和设备的所有配置信息的核心存储库。

1.RegistryRegistryKey类 

        NET Framework提供了访问注册表的类,比较常用的是Registry和RegistryKey类,这两个类都在Microsoft.Win32命名空间中。

(1)Registry类

        Registry类不能被实例化,它的作用只是实例化RegistryKey类,以便开始在注册表中浏览。Registry类是通过静态属性来提供这些实例的,这些属性共有7个:

属   性

说   明

ClassesRoot

定义文档的类型(或类)以及与那些类型关联的属性。该字段读取Windows注册表基项HKEY_CLASSES_ROOT

CurrentConfig

包含有关非用户特定的硬件的配置信息。该字段读取Windows注册表基项HKEY_CURRENT_CONFIG

CurrentUser

包含有关当前用户首选项的信息。该字段读取Windows注册表基项HKEY_CURRENT_USER

DynData

包含动态注册表数据。该字段读取Windows注册表基项HKEY_DYN_DATA

LocalMachine

包含本地计算机的配置数据。该字段读取Windows注册表基项HKEY_LOCAL_MACHINE

PerformanceData

包含软件组件的性能信息。该字段读取Windows注册表基项HKEY_PERFORMANCE_DATA

Users

包含有关默认用户配置的信息。该字段读取Windows注册表基项HKEY_USERS

        Registry类主要用于存储有关用户首选项的信息、存储本地计算机的配置信息、存储有关类型和类及其属性的信息、存储有关默认用户配置的信息、存储软件组件的性能信息、存储非用户特定的硬件信息、存储动态数据。

(2)RegistryKey类

        RegistryKey实例表示一个注册表项,这个类的方法可以浏览子键、创建新键、读取或修改键中的值。也就是说,该类可以完成对注册表项的所有操作。除了设置键的安全级别之外,RegistryKey类可以用于完成对注册表的所有操作。

        RegistryKey类的常用属性及说明:

属    性

说    明

Name

   检索项的名称

SubKeyCount

   检索当前项的子项数目

ValueCount

   检索项中值的计数

        RegistryKey类的常用方法及说明

方法

说 明

 Close

   关闭键

CreateSubkey

   创建给定名称的子键(如果该子键已经存在,就打开它)

DeleteSubkey

   删除指定的子键

DeleteSubkeyTree

   彻底删除子键及其所有的子键

DeleteValue

   从键中刑除一个指定的值

GetSubkeyNames

   返回包含子键名称的字符串数组

 GetValue

   返回指定的值

GetValueNames

   返回一个包含所有键值名称的字符申数组

OpenSubKey

   返回表示给定子键的 RegistryKey 实例引用

 SetValue

   设置指定

二、C#中操作注册表

        主要包括读取注册表中的信息删除注册表中的信息以及创建和删除注册表信息

1.读取注册表中的信息 

       读取注册表中的信息主要是通过RegistryKey类中的OpenSubKey()方法、GetSubKeyNames()方法和GetValueNames()方法实现的。

(1)OpenSubKey()方法

        OpenSubKey()方法用于检索指定的子项。

public RegistryKey OpenSubKey(string name)
☑ name:要以只读方式打开的子项的名称或路径。
☑ 返回值:请求的子项。如果操作失败,则为空引用。

        如果要打开的项不存在,OpenSubKey()方法将返回null引用,而不是引发异常。

(2)GetSubKeyNames()方法

        GetSubKeyNames()方法用于检索包含所有子项名称的字符串数组。

public string[]GetSubKeyNames()
返回值:包含当前项的子项名称的字符串数组。 

        如果当前项已被删除,或是用户没有读取该项的权限,将触发异常。

// 通过GetSubKeyNames()方法检索
// HKEY_LOCAL_MACHINE\SOFTWARE子键下包含的
// 所有子项名称的字符串数组
using Microsoft.Win32;

namespace _01
{
    public partial class Form1 : Form
    {
        private RichTextBox? richTextBox1;
        public Form1()
        {
            InitializeComponent();
            Load += new EventHandler(Form1_Load);
        }

        private void Form1_Load(object? sender, EventArgs e)
        {
            // 
            // richTextBox1
            // 
            richTextBox1 = new RichTextBox
            {
                Dock = DockStyle.Fill,
                Location = new Point(0, 0),
                Name = "richTextBox1",
                Size = new Size(284, 241),
                TabIndex = 0,
                Text = ""
            };

            RegistryKey regkey = Registry.LocalMachine;
            RegistryKey? sys = regkey.OpenSubKey(@"SOFTWARE");
            foreach (string str in sys!.GetSubKeyNames())
            {
                richTextBox1.Text += str + "\n";
            }

            // 
            // Form1
            // 
            AutoScaleDimensions = new SizeF(6F, 12F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(284, 241);
            Controls.Add(richTextBox1);
            Name = "Form1";
            StartPosition = FormStartPosition.CenterScreen;
            Text = "Form1";           
        }
    }
}

 

(3)GetValueNames()方法

        GetValueNames()方法用于检索包含与此项关联的所有值名称的字符串数组。

public string[]GetValueNames()
返回值:包含当前项的值名称的字符串数组。  

        如果没有找到此项的值名称,则返回一个空数组;如果在注册表项设置了一个具有默认值的名称为空字符串的项,则GetValueNames()方法返回的数组中包含该空字符串。

// 读取HKEY_LOCAL_MACHINE\SOFTWARE子键下的项目信息
// 利用对象的OpenSubKey()方法打开指定的键
using Microsoft.Win32;

namespace _02
{
    public partial class Form1 : Form
    {
        private ListBox? listBox1;
        public Form1()
        {
            InitializeComponent();
            Load += new EventHandler(Form1_Load);
        }

        private void Form1_Load(object? sender, EventArgs e)
        {
            listBox1 = new ListBox
            {
                Dock = DockStyle.Fill,
                FormattingEnabled = true,
                ItemHeight = 12,
                Location = new Point(0, 0),
                Name = "listBox1",
                Size = new Size(294, 271),
                TabIndex = 0
            };

            listBox1.Items.Clear();
            var regkey = Registry.LocalMachine;
            RegistryKey? sys = regkey.OpenSubKey(@"SOFTWARE");
            foreach (string str in sys!.GetSubKeyNames())
            {
                listBox1.Items.Add("子项名:" + str);
                RegistryKey? sikey = sys.OpenSubKey(str);  //打开子键
                foreach (string sVName in sikey!.GetValueNames())
                {
                    listBox1.Items.Add(sVName + sikey.GetValue(sVName));
                }
            }

            // 
            // Form1
            // 
            AutoScaleDimensions = new SizeF(6F, 12F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(294, 271);
            Controls.Add(listBox1);
            Name = "Form1";
            StartPosition = FormStartPosition.CenterScreen;
            Text = "Form1";
        }
    }
}

 

2.创建和修改注册表信息

(1)创建注册表信息

        通过RegistryKey类的CreateSubKey()方法和SetValue()方法可以创建注册表信息,下面介绍这两种方法。

  • CreateSubKey()方法

        主要用于创建一个新子项或打开一个现有子项以进行写访问。 

public RegistryKey CreateSubKey (string subkey)
☑ subkey:要创建或打开的子项的名称或路径。
☑ 返回值:RegistryKey对象,表示新建的子项或空引用。如果为subkey指定了零长度字符串,则返回当前的RegistryKey对象。
  • SetValue()方法

        主要用于设置注册表项中的名称/值对的值。

public void SetValue (string name,Object value)
☑ name:要存储的值的名称。
☑ value:要存储的数据。

        SetValue()方法用于从非托管代码中访问托管类,不应从托管代码调用。

// 通过RegistryKey类的CreateSubKey()方法和SetValue()方法创建一个子键
using Microsoft.Win32;

namespace _03
{
    public partial class Form1 : Form
    {
        private Button? button1;

        public Form1()
        {
            InitializeComponent();
            Load += new EventHandler(Form1_Load);
        }

        private void Form1_Load(object? sender, EventArgs e)
        {
            // 
            // button1
            // 
            button1 = new Button
            {                
                Location = new Point(12, 12),
                Name = "button1",
                Size = new Size(75, 23),
                TabIndex = 0,
                Text = "创建子键",
                UseVisualStyleBackColor = true
            };
            button1.Click += new EventHandler(Button1_Click);

            // 
            // Form1
            // 
            AutoScaleDimensions = new SizeF(6F, 12F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(384, 211);
            Controls.Add(button1);
            Name = "Form1";
            StartPosition = FormStartPosition.CenterScreen;
            Text = "创建子键";
        }
        /// <summary>
        /// 在主键HKEY_LOCAL_MACHINE的HARDWARE键下创建一个名为MR的子键,
        /// 然后在这个子键下再创建一个名为测试的子键,
        /// 在测试子键下创建一个名为value、数据值是1234的键值
        /// </summary>
        private void Button1_Click(object? sender, EventArgs e)
        {
            try
            {
                RegistryKey? hklm = Registry.LocalMachine;
                RegistryKey? software = hklm.OpenSubKey("HARDWARE", true);
                RegistryKey? main1 = software!.CreateSubKey("MR");
                RegistryKey? ddd = main1.CreateSubKey("测试");
                ddd.SetValue("value", "1234");
                MessageBox.Show("创建成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

 

(2)修改注册表信息

        由于注册表中的信息十分重要,所以一般不要对其进行写的操作。也可能是这个原因,在.Net Framework中并没有提供修改注册表键的方法。而只是提供了一个危害性相对较小的SetValue()方法,通过这个方法,可以修改键值。在使用SetValue()方法时,如果它检测到指定的键值不存在,就会创建一个新的键值。 

// 将主键HKEY_LOCAL_MACHINE\HARDWARE\MR\测试
// 下名为value的键值的数据值修改为abcd
using Microsoft.Win32;

namespace _04
{
    public partial class Form1 : Form
    {
        private Button? button1;

        public Form1()
        {
            InitializeComponent();
            Load += new EventHandler(Form1_Load);
        }

        private void Form1_Load(object? sender, EventArgs e)
        {
            // 
            // button1
            // 
            button1 = new Button
            {
                Location = new Point(197, 12),
                Name = "button1",
                Size = new Size(75, 23),
                TabIndex = 0,
                Text = "修改",
                UseVisualStyleBackColor = true
            };
            button1.Click += new EventHandler(Button1_Click);
            // 
            // Form1
            // 
            AutoScaleDimensions = new SizeF(6F, 12F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(284, 111);
            Controls.Add(button1);
            Name = "Form1";
            StartPosition = FormStartPosition.CenterScreen;
            Text = "Form1";
        }

        private void Button1_Click(object? sender, EventArgs e)
        {
            try
            {
                RegistryKey? hklm = Registry.LocalMachine;
                RegistryKey? software = hklm?.OpenSubKey("HARDWARE", true);
                RegistryKey? dddw = software?.OpenSubKey("MR", true);
                RegistryKey? regkey = dddw?.OpenSubKey("测试", true);
                regkey?.SetValue("value", "abcd");
                MessageBox.Show("修改成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

3.删除注册表中的信息

        删除注册表中的信息主要通过RegistryKey类中的DeleteSubKey()方法、DeleteSubKeyTree()方法和DeleteValue()方法来实现。

(1)DeleteSubKey()方法

        DeleteSubKey()方法用于删除不包含任何子键的子键。 语法如下:

publie void DeleteSubKey (string subkey,bool throwOnMissingSubKey)
☑ subkey:要删除的子项的名称。
☑ throwOnMissingSubKey:如果值为true,在程序调用时,删除的子键不存在,则产生一个错误信息;如果值为false,在程序调用时,删除的子键不存在,也不产生错误信息,程序依然正确运行。 

        如果删除的项有子级子项,将触发异常。必须将子项删除后,才能删除该项。

// 通过RegistryKey类的DeleteSubKey()方法删除
// HKEY_LOCAL_MACHINE\HARDWARE\MR键下的测试子键
using Microsoft.Win32;

namespace _05
{
    public partial class Form1 : Form
    {
        private Button? button1;
        public Form1()
        {
            InitializeComponent();
            Load += new EventHandler(Form1_Load);
        }

        private void Form1_Load(object? sender, EventArgs e)
        {
            // 
            // button1
            // 
            button1 = new Button
            {
                Location = new Point(118, 46),
                Name = "button1",
                Size = new Size(75, 23),
                TabIndex = 0,
                Text = "删除",
                UseVisualStyleBackColor = true
            };
            button1.Click += new EventHandler(Button1_Click);
            // 
            // Form1
            // 
            AutoScaleDimensions = new SizeF(6F, 12F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(331, 99);
            Controls.Add(button1);
            Name = "Form1";
            Text = "Form1";
        }

        /// <summary>
        /// 打开"SOFTWARE"子键
        /// 打开MR子键
        /// 删除名称为测试的子键
        /// </summary>
        private void Button1_Click(object? sender, EventArgs e)
        {
            try
            {
                RegistryKey? hklm = Registry.LocalMachine;
                RegistryKey? software = hklm?.OpenSubKey("HARDWARE", true);
                RegistryKey? no1 = software?.OpenSubKey("MR", true);
                no1?.DeleteSubKey("测试", false);
                MessageBox.Show("删除成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

(2)DeleteSubKeyTree方法

        DeleteSubKeyTree()方法用于彻底删除指定的子键目录,包括删除该子键以及该子键以下的全部子键。由于此方法的破坏性非常强,所以在使用时要特别谨慎。语法如下:

public void DeleteSubKeyTree(sting subkey)
subkey:要彻底删除的子键名称。 

        当删除的项为null时,则触发异常。

// 通过DeleteSubKeyTree()方法将彻底删除
// HKEY_LOCAL_MACHINE\HARDWARE\MR键下的子键
using Microsoft.Win32;

namespace _06
{
    public partial class Form1 : Form
    {
        private Button? button1;
        public Form1()
        {
            InitializeComponent();
            Load += new EventHandler(Form1_Load);
        }

        private void Form1_Load(object? sender, EventArgs e)
        {
            // 
            // button1
            // 
            button1 = new Button
            {
                Location = new Point(151, 12),
                Name = "button1",
                Size = new Size(121, 23),
                TabIndex = 0,
                Text = "彻底删除子键",
                UseVisualStyleBackColor = true
            };
            button1.Click += new EventHandler(Button1_Click);
            // 
            // Form1
            // 
            AutoScaleDimensions = new SizeF(6F, 12F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(284, 111);
            Controls.Add(button1);
            Name = "Form1";
            StartPosition = FormStartPosition.CenterScreen;
            Text = "Form1";
        }
        /// <summary>
        /// 打开"SOFTWARE"子键
        /// 打开MR子键
        /// 删除名称为测试的子键
        /// </summary>
        private void Button1_Click(object? sender, EventArgs e)
        {
            try
            {
                RegistryKey? hklm = Registry.LocalMachine;
                //hklm.DeleteSubKey("aaa", false);
                RegistryKey? software = hklm.OpenSubKey("HARDWARE", true);
                RegistryKey? no1 = software?.OpenSubKey("MR", true);
                no1!.DeleteSubKeyTree("测试");
                MessageBox.Show("删除成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

(3)DeleteValue()方法 

        DeleteValue()方法主要用于删除指定的键值。语法如下:

publie void DeleteValue(string name)
name:要删除的值的名称。
如果在找不到指定值的情况下使用该值,又不想引发异常,可以使用DeleteValue(string name,bool throwOnMissingValue)重载方法。如果throwOnMissingValue参数为true时,将不引发异常。
// 通过DeleteValue方法删除
// HKEY_LOCAL_MACHINE\HARDWARE\MR\测试键下的名称为value的键值
using Microsoft.Win32;

namespace _07
{
    public partial class Form1 : Form
    {
        private Button? button1;
        public Form1()
        {
            InitializeComponent();
            Load += new EventHandler(Form1_Load);
        }

        private void Form1_Load(object? sender, EventArgs e)
        {
            // 
            // button1
            // 
            button1 = new Button
            {
                Location = new Point(132, 12),
                Name = "button1",
                Size = new Size(75, 23),
                TabIndex = 0,
                Text = "删除键值",
                UseVisualStyleBackColor = true
            };
            button1.Click += new EventHandler(Button1_Click);
            // 
            // Form1
            // 
            AutoScaleDimensions = new SizeF(6F, 12F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(219, 196);
            Controls.Add(button1);
            Name = "Form1";
            StartPosition = FormStartPosition.CenterScreen;
            Text = "Form1";
        }

        /// <summary>
        /// 打开"SOFTWARE"子键
        /// 打开MR子键,打开测试子键
        /// 删除名称为"value"的键值
        /// </summary>
        private void Button1_Click(object? sender, EventArgs e)
        {
            try
            {
                RegistryKey? hklm = Registry.LocalMachine;
                RegistryKey? software = hklm?.OpenSubKey("HARDWARE", true);
                RegistryKey? no1 = software?.OpenSubKey("MR", true);
                RegistryKey? no2 = no1?.OpenSubKey("测试", true);
                no2?.DeleteValue("value");
                MessageBox.Show("删除键值成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }    
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1298082.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringSecurity6 | 自定义认证规则

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…

Java基础-java.util.Scanner接收用户输入

目录 1. 导入所需要的jar包2. 编写代码运行3. 输出运行结果 1. 导入所需要的jar包 import java.util.Scanner;2. 编写代码运行 public class ScannerDemo {public static void main(String[] args) {/** 使用Scanner接收用户键盘输入的数据* 1. 导包&#xff1a;告诉程序去JD…

角谷定理 C语言xdoj32

角谷定理定义如下&#xff1a; 对于一个大于1的整数n&#xff0c;如果n是偶数&#xff0c;则n n / 2。如果n是奇数&#xff0c;则n 3 * n 1&#xff0c;反复操作后&#xff0c;n一定为1。 例如输入22的变化过程&#xff1a; 22 ->11 -> 34 -> 17 -> 52 -> 26 …

探索 Python 中链表的实现:从基础到高级

# 更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 链表是一种基础的数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点都包含数据和指向下一个节点的引用。在Python中&#xff0c;可以使用类来实现链表&#xff0c;本文将介绍如何实现链表&#xff…

人工智能原理复习--搜索策略(二)

文章目录 上一篇启发式搜索与或图搜索博弈下一篇 上一篇 人工智能原理复习–搜索策略&#xff08;一&#xff09; 启发式搜索 提高一般图搜索效率的关键是优化OPEN表中节点的排序方式 最理想的情况是每次排序OPEN表表首n总在解答路径上 全局排序–对OPEN表中的所有节点进行…

论文阅读:PointCLIP: Point Cloud Understanding by CLIP

CVPR2022 链接&#xff1a;https://arxiv.org/pdf/2112.02413.pdf 0、Abstract 最近&#xff0c;通过对比视觉语言预训练(CLIP)的零镜头学习和少镜头学习在2D视觉识别方面表现出了鼓舞人心的表现&#xff0c;即学习在开放词汇设置下将图像与相应的文本匹配。然而&#xff0c;…

内外联动——记建行江门鹤山支行营业部堵截一起新型骗局

建设银行广东省江门市分行&#xff08;以下简称“江门建行”&#xff09;认真贯彻落实党中央、国务院决策部署&#xff0c;紧紧围绕当地市委工作部署和上级行要求&#xff0c;扛牢国有大行责任&#xff0c;坚守金融工作的政治性、人民性&#xff0c;以深化新金融行动助力江门全…

skynet 中 mongo 模块运作的底层原理解析

文章目录 前言总览全流程图涉及模块关系连接数据库函数调用流程图数据库操作函数调用流程图涉及到的代码文件 建立连接SCRAMSASL 操作数据库结语参考链接 前言 这篇文章总结 skynet 中 mongo 的接入流程&#xff0c;代码解析&#xff0c;读完它相信你对 skynet 中的 mongo 调用…

蓝桥杯日期问题

蓝桥杯其他真题点这里&#x1f448; 注意日期合法的判断 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class Main{static int[] days {0,31,28,31,30,31,30,31,31,30,31,30,31};static BufferedReader in new Buf…

Python数据科学视频讲解:数据清洗、特征工程和数据可视化的注意事项

1.6 数据清洗、特征工程和数据可视化的注意事项 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解1.6节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵盖数据科学应用的全流程…

【数电笔记】58-同步D触发器

目录 说明&#xff1a; 1. 电路组成 2. 逻辑功能 3. 特性表、特性方程 4. 状态转移图 例题 5. 同步D触发器的特点 6. 集成同步D触发器&#xff1a;74LS375 74LS375内部原理 说明&#xff1a; 笔记配套视频来源&#xff1a;B站本系列笔记并未记录所有章节&#xff0c;…

2024最新软件测试面试最全八股文

请你说一说测试用例的边界 参考回答&#xff1a; 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充&#xff0c;这种情况下&#xff0c;其测试用例来自等价类的边界。 常见的边界值 1)对16-bit 的整数而言 32…

ELK简单介绍一

任务背景 运维人员需要对系统和业务日志进行精准把控&#xff0c;便于分析系统和业务状态。日志分布在不同的服务器上&#xff0c;传统的使用传统的方法依次登录每台服务器查看日志&#xff0c;既繁琐又效率低下。所以我们需要集中化的日志管理工具将位于不同服务器上的日志收…

[仅供学习,禁止用于违法]编写一个程序来手动设置Windows的全局代理开或关,实现对所有网络请求拦截和数据包捕获(抓包或VPN的应用)

文章目录 介绍一、实现原理二、通过注册表设置代理2.1 开启代理2.2 关闭代理2.3 添加代理地址2.4 删除代理设置信息 三、代码实战3.1 程序控制代理操作控制3.1.1 开启全局代理3.1.2 添加代理地址3.1.3 关闭代理开关3.1.4 删除代理信息 3.2 拦截所有请求 介绍 有一天突发奇想&am…

Finereport基于linux的简单安装(单节点)

简介 本文以单节点简单部署为例&#xff0c;不适用企业级高可用部署策略。 FineReport的运行依赖于Tomcat &#xff0c;Tomcat 是免费且性能相对稳定的 Web 应用服务器,也可以充当JSP容器。它是一个用于运行Java Servlet和JavaServer Pages&#xff08;JSP&#xff09;的Web服务…

十八、FreeRTOS之FreeRTOS任务通知

本节需要掌握以下内容&#xff1a; 1、任务通知的简介&#xff08;了解&#xff09; 2、任务通知值和通知状态&#xff08;熟悉&#xff09; 3、任务通知相关API函数介绍&#xff08;熟悉&#xff09; 4、任务通知模拟信号量实验&#xff08;掌握&#xff09; 5、任务通知…

第一课【习题】使用DevEco Studio高效开发

用哪一种装饰器修饰的组件可作为页面入口组件 ArkTS Stage模型支持API Version 9&#xff0c;关于其工程目录结构说法正确的是&#xff1f; 4. DevEco Studio提供模拟器供开发者运行和调试HarmonyOS应用/服务&#xff0c;以下说法错误的是&#xff1f; DevEco Studio支持使…

2023年9月8日 Go生态洞察:gopls的扩展与Go生态系统的成长

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Qt之实现文字滚动效果

一.效果 二.实现 roller.h #ifndef ROLLER_H #define ROLLER_H#include <QWidget> #include <QPaintEvent> #include <QShowEvent> #include <QHideEvent> #include <QTimer>class Roller : public QWidget { public:explicit Roller(QWidget …

git标签的管理与思考

git 标签管理 git 如何打标签呢&#xff1f; 标签是什么? 标签 相当于一个 版本管理的一个贴纸&#xff0c;随时 可以通过标签 切换到 这个版本的状态 &#xff0c; 有人可能有疑问 git commit 就可以知道 代码的改动了&#xff0c; 为啥还需要标签来管理呢&#xff1f; …