0%

  • 来源:明日科技
  • 利用多饼型图分析企业人力资源情况

    实例说明

    开发企业人力资源管理系统时,经常使用饼型图分析企业中各个阶层的人员情况,为了让用户更清晰地认识,本实例采用了多饼图表示法实现分析功能。实例运行效果如图1所示。
    图1 利用多饼型图分析企业人力资源情况

    关键技术

    本实例在实现时,首先通过SQL语句分别统计企业总人数和各个阶层人数,然后通过统计的比例绘制饼型图,实现过程中主要用到Graphics类的DrawLine方法、DrawString方法和FillPie方法。

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为MultiCAnalyseHR。
    (2)更改默认窗体Form1的Name属性为Frm_Main,在该窗体中添加一个Panel控件,用来显示绘制的多个饼型图。
    (3)程序主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    private void ShowPic(int Sum)
    {
    using (cmd = new SqlCommand("select t_Point,sum(t_Num) from tb_manpower group by t_Point order by sum(t_Num) desc", con))
    {
    Bitmap bmp = new Bitmap(this.panel1.Width, this.panel1.Height); //创建画布
    Graphics g = Graphics.FromImage(bmp); //创建Graphics对象
    cmd.Connection.Open();
    SqlDataReader dr = cmd.ExecuteReader(); //创建SqlDataReader对象
    while (dr.Read())//开始读取记录
    {
    float f = Convert.ToSingle(dr[1]) / Sum;
    string str = dr[0].ToString();
    drowPic(g, f, str); //调用drowPic方法绘制饼图
    }
    //绘制线条
    g.DrawLine(new Pen(Color.Black), 0, this.panel1.Height / 2, this.panel1.Width, this.panel1.Height / 2);
    g.DrawLine(new Pen(Color.Black), this.panel1.Width / 2, 0, this.panel1.Width / 2, this.panel1.Height);
    this.panel1.BackgroundImage = bmp;//显示绘制的图形
    dr.Close(); //关闭SqlDataReader对象
    con.Close();//关闭数据库连接
    }
    }
    private void drowPic(Graphics g, float f, string str) //根据要求绘制饼图
    {
    if (ConutNum == 0)//如果ConutNum为0时执行
    {
    //绘制扇形
    g.FillPie(new SolidBrush(Color.Black), 0, 0, (this.panel1.Width) / 2, (this.panel1.Height - 10) / 2, 0, 360 * f);
    //绘制文本
    g.DrawString(str, new Font("宋体", 10, FontStyle.Bold), new SolidBrush(Color.Black), (this.panel1.Width) / 2 - 70, 10);
    g.DrawString(Convert.ToString(f * 100).Substring(0, 5) + "%", new Font("宋体", 10, FontStyle.Bold), new SolidBrush(Color.Black), (this.panel1.Width) / 2 - 70, 25); //绘制文本
    floatNum = 360 * f; //计算角度
    ConutNum += 1;//使ConutNum为1
    }
    else if (Conu tNum == 1) //如果ConutNum为1时执行
    {
    //绘制扇形
    g.FillPie(new SolidBrush(Color.DarkOrange), (this.panel1.Width) / 2, 0, (this.panel1.Width) / 2, (this.panel1.Height - 10) / 2, floatNum, 360 * f);
    //绘制文本
    g.DrawString(str, new Font("宋体", 10, FontStyle.Bold), new SolidBrush(Color.DarkOrange), (this.panel1.Width) / 2 + 10, 10);
    g.DrawString(Convert.ToString(f * 100).Substring(0, 5) + "%", new Font("宋体", 10, FontStyle.Bold), new SolidBrush(Color.DarkOrange), (this.panel1.Width) / 2 + 10, 25); //绘制文本
    floatNum += 360 * f; //计算角度
    ConutNum += 1;// ConutNum为2
    }
    else if (ConutNum == 2) // ConutNum为2时执行
    {
    g.FillPie(new SolidBrush(Color.Red), 0, (this.panel1.Height - 10) / 2 + 10, (this.panel1.Width) / 2, (this.panel1.Height - 10) / 2, floatNum, 360 * f);//绘制扇形
    //绘制文本
    g.DrawString(str, new Font("宋体", 10, FontStyle.Bold), new SolidBrush(Color.Red), 10, (this.panel1.Height - 10) / 2 + 20);
    g.DrawString(Convert.ToString(f * 100).Substring(0, 5) + "%", new Font("宋体", 10, FontStyle.Bold), new SolidBrush(Color.Red), 10, (this.panel1.Height - 10) / 2 + 35); //绘制文本
    floatNum += 360 * f; //计算角度
    ConutNum += 1;// ConutNum为3
    }
    else if (ConutNum == 3) // ConutNum为3时执行
    {
    g.FillPie(new SolidBrush(Color.Blue), (this.panel1.Width) / 2 - 10, (this.panel1.Height - 10) / 2 + 10, (this.panel1.Width) / 2, (this.panel1.Height - 10) / 2, floatNum, 360 * f); //绘制扇形
    g.DrawString(str, new Font("宋体", 10, FontStyle.Bold), new SolidBrush(Color.Blue), (this.panel1.Width) / 2 + 10, (this.panel1.Height - 10) / 2 + 20);//绘制文本
    g.DrawString(Convert.ToString(f * 100).Substring(0, 5) + "%", new Font("宋体", 10, FontStyle.Bold), new SolidBrush(Color.Blue), (this.panel1.Width) / 2 + 10, (this.panel1.Height - 10) / 2 + 35); //绘制文本
    }
    }

    秘笈心法

    心法领悟014:绘制多饼型图的实现原理!
    绘制多饼型图时,首先需要计算各个部分所占的比例,然后依次绘制各个部分在饼型图中所占的比例,在绘制过程中,从第一部分首先开始绘制,绘制结束后,记录其绘制的扇形结束位置,并以该位置为起点,开始绘制第二部分,依次类推,直到绘制完最后一部分,这样就实现了绘制多饼型图的功能。

  • 来源:明日科技
  • 利用图片对文件进行加密与解密

    实例说明

    本实例在加密时,使用指定的图片生成加密密钥,然后对文本文件进行加密;在解密时,使用加密时的图片生成解密密钥,然后对加密的文本文件进行解密。在本实例的窗体中,首先打开一个图片,用来生成加密或解密的密钥,然后选择要加密或解密的文本文件,最后点击“加密”或“解密”按钮,实现对文本文件的加密或解密。实例运行效果如图1所示。
    图1 利用图片对文件进行加密与解密

    关键技术

    实现本实例,主要用到了RC2CryptoServiceProvider类、BinaryWriter类的Write方法、File类的Delete方法和Copy方法分别进行介绍。
    (1)RC2CryptoServiceProvider类 该类定义访问RC2算法的加密服务提供程序(CSP)实现的包装对象,无法继承此类。
    (2)BinaryWriter类 该类以二进制形式将基元类型写入流,并支持用特定的编码写入字符串。它的构造器语法格式如下: public BinaryWriter (Streamoutput) 参数说明 output:表示输出流。
    (3)BinaryWriter类的Write方法 该方法将一个无符号字节写入当前流,并将流的位置提升一个字节。其语法格式如下: public virtual void Write (byte value) 参数说明 value:表示要写入的无符号字节。
    (4)File类 该类提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建FileStream对象,该类是个静态类。
    (5)File类的Delete方法 该方法删除指定的文件。如果指定的文件不存在,则引发异常。其语法格式如下: public static void Delete (string path) 参数说明 path:表示要删除的文件的名称。
    (6)File类的Copy方法 该方法将现有文件复制到新文件,不允许改写同名的文件。其语法格式如下:
    public static void Copy (string sourceFileName,string destFileName) 参数说明
    sourceFileName:要复制的文件。
    destFileName:目标文件的名称,不能是一个目录或现有文件。

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为EncryptTextFileTwo。
    (2)在Form1窗体中,主要添加一个TextBox控件,用来显示加密或解密文件的路径;添加一个OpenFileDialog控件,用来选择要加密或解密的文件和打开密钥的图片;添加4个Button控件,用来执行加密、解密、打开文件和打开图片操作;添加一个PictureBox控件,用于显示密钥图片。
    (3)程序主要代码如下: 单击“加密”按钮实现利用图片对文本文件进行加密,“加密”按钮的Click事件代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    private void button3_Click(object sender, EventArgs e)
    {
    try
    {
    if (pictureBox1.ImageLocation == null) //判断是否选择了图片
    { MessageBox.Show(" 请选择一幅图片用于加密 "); return; }//如果没有选择则弹出提示
    if (textBox1.Text == " ")//若未选择需要加密的文件
    { MessageBox.Show(" 请选择加密文件路径 "); return; } //如果没有选择则弹出提示
    //图片流
    FileStream fsPic = new FileStream(pictureBox1.ImageLocation, FileMode.Open, FileAccess.Read);
    //加密文件流
    FileStream fsText = new FileStream(textBox1.Text, FileMode.Open, FileAccess.Read);
    //初始化对称算法的密钥和向量
    byte[] bykey = new byte[16]; //定义存储密钥的字节数组
    byte[] byIv = new byte[8]; //定义存储向量的字节数组
    fsPic.Read(bykey, 0, 16); //把图片流写入密钥缓冲区
    fsPic.Read(byIv, 0, 8);//把图片流写入向量缓冲区
    //临时加密文件
    string strPath = textBox1.Text; //加密文件的路径
    int intLent = strPath.LastIndexOf("\\\") +1;
    int intLong = strPath.Length;
    string strName = strPath.Substring(intLent, intLong - intLent);//要加密的文件名称
    string strLinPath = " C:\\\" +strName; //临时加密文件路径
    FileStream fsOut = File.Open(strLinPath, FileMode.Create, FileAccess.Write);
    //开始加密,首先创建RC2CryptoServiceProvider对象
    RC2CryptoServiceProvider desc = new RC2CryptoServiceProvider();
    BinaryReader br = new BinaryReader(fsText); //创建BinaryReader对象
    //创建CryptoStream对象,用于写入临时加密文件
    CryptoStream cs = new CryptoStream(fsOut, desc.CreateEncryptor(bykey, byIv), CryptoStreamMode.Write);
    cs.Write(br.ReadBytes((int)fsText.Length), 0, (int)fsText.Length);//写入加密流
    cs.FlushFinalBlock();
    cs.Flush();
    cs.Close();
    fsPic.Close();
    fsText.Close();
    fsOut.Close();
    File.Delete(textBox1.Text.TrimEnd()); //删除原文件
    File.Copy(strLinPath, textBox1.Text); //复制加密文件
    File.Delete(strLinPath);//删除临时文件
    MessageBox.Show(" 加密成功 ");
    pictureBox1.ImageLocation = null;
    textBox1.Text = " ";
    }
    catch (Exception ee)
    {
    MessageBox.Show(ee.Message);
    }
    }

    单击“解密”按钮实现利用图片对加密的文本文件进行解密,“解密”按钮的Click事件代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    private void button4_Click(object sender, EventArgs e)
    {
    try
    {
    //图片流
    FileStream fsPic = new FileStream(pictureBox1.ImageLocation, FileMode.Open, FileAccess.Read);
    //解密文件流
    FileStream fsOut = File.Open(textBox1.Text, FileMode.Open, FileAccess.Read);
    //初始化对称算法的密钥和向量
    byte[] bykey = new byte[16]; //定义存储密钥的字节数组
    byte[] byIv = new byte[8]; //定义存储向量的字节数组
    fsPic.Read(bykey, 0, 16); //把图片流写入密钥缓冲区
    fsPic.Read(byIv, 0, 8);//把图片流写入向量缓冲区
    //创建临时解密文件
    string strPath = textBox1.Text; //加密文件的路径
    int intLent = strPath.LastIndexOf("\\\") +1;//获取不含文件名的路径长度
    int intLong = strPath.Length; //获取含文件名的路径长度
    //获取要解密文件的名称,即加密文件的名称
    string strName = strPath.Substring(intLent, intLong - intLent);
    string strLinPath = " C:\\\" +strName; //临时解密文件路径
    FileStream fs = new FileStream(strLinPath, FileMode.Create, FileAccess.Write);
    //开始解密,首先创建RC2CryptoServiceProvider对象
    RC2CryptoServiceProvider desc = new RC2CryptoServiceProvider();
    //创建CryptoStream对象,用于读取加密文件
    CryptoStream csDecrypt = new CryptoStream(fsOut, desc.CreateDecryptor(bykey, byIv), CryptoStreamMode.Read);
    BinaryReader sr = new BinaryReader(csDecrypt); //创建BinaryReader对象
    BinaryWriter sw = new BinaryWriter(fs);//创建BinaryWriter对象
    sw.Write(sr.ReadBytes(Convert.ToInt32(fsOut.Length))); //写入解密流
    sw.Flush();
    sw.Close();
    sr.Close();
    fs.Close();
    fsOut.Close();
    fsPic.Close();
    csDecrypt.Flush();
    File.Delete(textBox1.Text.TrimEnd()); //删除原文件
    File.Copy(strLinPath, textBox1.Text); //复制加密文件
    File.Delete(strLinPath);//删除临时文件
    MessageBox.Show(" 解密成功 "); //弹出提示信息
    pictureBox1.ImageLocation = null; //清空图片
    textBox1.Text = " ";//清空文本框
    }
    catch (Exception ee) //如果出现异常
    {
    MessageBox.Show(ee.Message); //输出异常
    }
    }

    秘笈心法

    心法领悟002:使用CryptoStream类的FlushFinalBlock方法。
    在调用CryptoStream类的Write方法写入加密或解密流之后,需要调用该类的FlushFinalBlock方法,该方法实现用缓冲区的当前状态更新基础数据源或储存库,随后清除缓冲区。

  • 来源:明日科技
  • 不出现在任务栏上的程序

    实例说明

    一般的Windows应用程序启动后,系统会在任务栏中添加一个工具按钮,表示程序正在运行,该按钮中的文字就是程序或窗口的标题名称。但是一些黑客程序和一些系统程序在启动后,任务栏中不会出现这些程序的按钮,这样的程序通常在后台运行,有时用户根本不会察觉,那么这是怎么实现的呢?本实例将介绍如何控制程序是否显示在任务栏中。运行结果如图1所示。
    图1 不出现在任务栏上的程序

    技术要点

    本实例通过使用Form类的ShowInTaskbar属性来控制程序是否显示在任务栏中。ShowInTaskbar属性用来获取或设置一个值,该值指示是否在Windows任务栏中显示窗体。其语法格式如下:
    public bool ShowInTaskbar { get; set; }
    属性值:如果为True,则运行时在Windows任务栏中显示窗体,否则为False。默认为True。

    实现过程

    (1)新建一个Windows应用程序,将其命名为“不出现在任务栏上的程序”,默认主窗体为Form1。
    (2)在Form1窗体中添加两个RadioButton控件,用来控制程序图标是否出现在任务栏中。
    (3)主要程序代码。

    1
    2
    3
    4
    5
    6
    7
    private void Form1_Load(object sender, EventArgs e)
    {
    if (radioButton1.Checked) //如果选中radioButton1
    this.ShowInTaskbar = true;//将ShowInTaskbar属性设为true,在任务栏显示
    else//否则
    this.ShowInTaskbar = false;//将ShowInTaskbar属性设为false,不在任务栏显示
    }

  • 来源:明日科技
  • 使用正则表达式验证URL

    实例说明

    在浏览网页时,可以在浏览器的地址栏中输入网址信息并按下键跳转到指定网页,如果用户输入的网址不正确,则无法显示网页信息。实例中使用了正则表达式判断用户输入的网址信息是否正确。实例运行效果如图1所示。
    图1 使用正则表达式验证URL

    关键技术

    本实例重点在于向读者介绍怎样使用正则表达式验证URL,下面对其进行详细讲解。 实例中主要用到了Regex类的IsMatch方法,此方法的使用已经在实例“使用正则表达式验证电话号码”中进行了详细讲解。下面对实例中使用的正则表达式进行详细讲解。 从图2中可以看到,详细的描述了”http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=])?”正则表达式,其中http(s)?表示匹配字符串“http”或“https”;[\w-]+\.表示匹配一个或多个以单词字符和连接符号“-”组成的字符串开头的,以字符“.”结尾的字符串;(/[\w- ./?%&=])?表示匹配出现零次或一次由单词字符“-”、“/”、“.”、“?”、“%”、“&”、“=”组成的长度至少为1的字符串。 图2 正则表达式

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为ValidateURL。
    (2)更改默认窗体Form1的Name属性为Frm_Main,向窗体中添加一个TextBox控件,用于输入网址;添加一个Button按钮,用于验证网址格式是否正确。
    (3)程序主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public bool IsUrl(string str_url)

    {

    return System.Text.RegularExpressions.Regex.IsMatch(str_url, //使用正则表达式判断是否匹配

    @"http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?");

    }

    秘笈心法

    心法领悟058:使用正则表达式验证用户名格式是否正确!
    程序运行过程中,经常需要用户注册信息,以得到相应的操作权限,如果在用户注册的过程中,用户添写的用户名格式不正确,有可能会带来不必要的麻烦,使用正则表达式验证用户名格式将是一种不错的选择!

  • 来源:明日科技
  • 在饼型图的外围显示说明文字

    实例说明

    饼型图可以很直观的显示一些信息的比例,如果信息过多则需要在饼型图上绘制说明文字,这样,才可以更好的了解饼型图所代表的含义。本实例使用C#实现了在饼型图的外围绘制说明文字的功能,实例运行效果如图1所示。
    图1 在饼型图的外围显示说明文字

    关键技术

    本实例实现时主要使用Graphics 类的FillPie方法绘制饼型图,使用FillRectangle方法和DrawRectangle方法绘制说明文字的矩形框及矩形框的边,使用DrawString方法绘制说明文字。下面对本实例中用到的关键技术进行详细讲解。
    DrawRectangle方法用于绘制由坐标对、宽度和高度指定的矩形,其语法格式如下:
    public void DrawRectangle(Pen pen,int x,int y,int width,int height)
    DrawRectangle方法语法中的参数及说明如表1所示。 表1
    DrawRectangle方法语法中的参数及说明

    参数 说明
    pen Pen,它确定矩形的颜色、宽度和样式
    x 要绘制的矩形的左上角的x坐标
    y 要绘制的矩形的左上角的y坐标
    width 要绘制的矩形的宽度
    height 要绘制的矩形的高度

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为TextInCaky。
    (2)更改默认窗体Form1的Name属性为Frm_Main,在该窗体中添加一个Panel控件,用来显示带有说明文字的饼型图。
    (3)程序主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    public void ProtractArea(Graphics g)       //绘制饼型图表

    {

    AreaValue(); //计算最长说明文字的大小

    mypen = new Pen(Color.Black, 1); //设置画笔的颜色及大小

    float f = 0; //记录百分比

    float TimeNum = 0; //扇形的绘制度数

    float AXLeft = 0; //设置饼型图的X坐标

    float AYUp = 0; //设置饼型图的Y坐标

    float AXSize = 0; //设置饼型图的宽度

    float AYSize = 0; //设置饼型图的高度

    float Atop = 0; //记录饼型的高度为长和宽的最小值

    float Aleft = 0; //记录饼型的高度为长和宽的最小值

    TimeNum = AreaAngle; //设置饼型图的起始度数

    //计算饼型图的初始位置

    XLeft = panel1.Width - (panel1.Width - 5); //去了边框后饼型图的X位置

    XSize = panel1.Width - 10; //设置饼型图的宽度

    temXLeft = AXLeft; //记录饼型图的X坐标

    AXLeft = XLeft; //记录饼型图的X坐标

    AXSize = XSize; //记录饼型图的宽度

    //通过说明文字的大小计算饼型图的位置

    AXLeft = AXLeft + AreaXMaxWidth + Aline; //设置去除说明文字后的饼型图X坐标

    AYUp = AYUp + AreaXMaxHeight; //设置去除说明文字后的饼型图Y坐标

    AXSize = XSize - AreaXMaxWidth * 2 - Aline * 2; //设置去除说明文字后的饼型图宽度

    AYSize = YSize - AreaXMaxHeight * 2; //设置去除说明文字后的饼型图高度

    if (AXSize >= AYSize)//如果饼型图的宽度大于等于高度

    {

    Aleft = AXSize - AYSize; //记录饼型图的X坐标

    AXSize = AYSize; //将高度设为宽度

    }

    else

    {

    Atop = AYSize - AXSize; //记录饼型图的Y坐标

    AYSize = AXSize; //将宽度设为高度

    }

    if (Aleft != 0)//如果宽大于高

    {

    AXLeft = AXLeft + Aleft / 2; //设置饼型图横向局中

    }

    if (Atop != 0)//如果高大于宽

    {

    AYUp = AYUp + Atop / 2; //设置饼型图纵向局中

    }

    temXLeft = XLeft;

    //绘制饼型图

    if (AXSize > 0 && AYSize > 0) //如果饼型图的宽和高大于0

    {

    for (int i = 0; i < SzData.Length; i++) //遍历数据

    {

    f = SzData[i] / ASum; //获取当前数据的百分比

    //设置当前扇形图的填充颜色

    if (i >= WearColor.Length) //如果没有超出颜色数组

    mybrush = new SolidBrush(WearColor[i - WearColor.Length]);

    else

    mybrush = new SolidBrush(WearColor[i]);

    g.FillPie(mybrush, AXLeft, AYUp, AXSize, AYSize, TimeNum, f * 360); //绘制扇形图

    TimeNum += f * 360; //设置下一个扇形图的度数

    }

    ProAreaSign(g); //绘制饼型图的说明文字

    }

    else

    return;

    }

    #endregion

    #region 绘制饼型图标识(Area)

    public void ProAreaSign(Graphics g)

    {

    AreaValue(); //存储最长的名称

    mypen = new Pen(Color.Black, 1); //设置画笔的颜色及大小

    Font LSfont = new System.Drawing.Font("宋体", 8); //设置说明文字的字体样式

    SolidBrush Zbrush = new SolidBrush(Color.Black); //设置存放说明文字边框的画刷

    SolidBrush ATbrush = new SolidBrush(Color.Khaki); //设置存放说明文字方块的背景画刷

    float f = 0; //记录百分比

    float TimeNum = 0; //扇形的绘制度数

    float AXLeft = 0; //设置饼型图的X坐标

    float AYUp = 0; //设置饼型图的Y坐标

    float AXSize = 0; //设置饼型图的宽度

    float AYSize = 0; //设置饼型图的高度

    float Atop = 0; //记录饼型的高度为长和宽的最小值

    float Aleft = 0; //记录饼型的高度为长和宽的最小值

    Graphics TitG = panel1.CreateGraphics(); //创建Graphics对象

    SizeF XMaxSize = TitG.MeasureString("", LSfont); //将绘制的字符串进行格式化

    float SWidth = 0; //获取字符串的宽度

    float SHeight = 0; //获取字符串的高度

    //计算饼型图的初始位置

    XLeft = panel1.Width - (panel1.Width - 5); //去了边框后饼型图的X位置

    XSize = panel1.Width - 10; //设置饼型图的宽度

    temXLeft = AXLeft; //记录饼型图的X坐标

    AXLeft = XLeft; //记录饼型图的X坐标

    AXSize = XSize; //记录饼型图的宽度

    //通过说明文字的大小计算饼型图的位置

    AXLeft = AXLeft + AreaXMaxWidth + Aline; //设置去除说明文字后的饼型图X坐标

    AYUp = AYUp + AreaXMaxHeight; //设置去除说明文字后的饼型图Y坐标

    AXSize = XSize - AreaXMaxWidth * 2 - Aline * 2; //设置去除说明文字后的饼型图宽度

    AYSize = YSize - AreaXMaxHeight * 2; //设置去除说明文字后的饼型图高度

    if (AXSize >= AYSize)//如果饼型图的宽度大于等于高度

    {

    Aleft = AXSize - AYSize; //记录饼型图的X坐标

    AXSize = AYSize; //将高度设为宽度

    }

    else

    {

    Atop = AYSize - AXSize; //记录饼型图的Y坐标

    AYSize = AXSize; //将宽度设为高度

    }

    if (Aleft != 0)//如果宽大于高

    {

    AXLeft = AXLeft + Aleft / 2; //设置饼型图横向局中

    }

    if (Atop != 0)//如果高大于宽

    {

    AYUp = AYUp + Atop / 2; //设置饼型图纵向局中

    }

    temXLeft = XLeft;

    //初始化说明文字前横线的变量

    float X1 = 0;

    float Y1 = 0;

    float X2 = 0;

    float Y2 = 0;

    //初始化说明文字位置的变量

    float TX1 = 0;

    float TY1 = 0;

    float TX2 = 0;

    float TY2 = 0;

    float temf = 0; //记录百分比

    double radians = 0; //记录扇形的角度

    temf = (this.AreaAngle * (ASum / 360) / ASum); //记录起始位置的度数

    TimeNum = this.AreaAngle; //记录扇形的起始角度

    //绘制说明文字

    if (AXSize > 0 && AYSize > 0)

    {

    for (int i = 0; i < SzData.Length; i++) //遍历所有说明文字

    {

    f = SzData[i] / ASum; //获取当前记录的百分比

    if (f == 0) //如果当前值为0

    continue; //执行下一次循环

    radians = ((double)((temf + f / 2) * 360) * Math.PI) / (double)180;

    X1 = Convert.ToSingle(AXLeft + (AXSize / 2.0 + (int)((float)(AXSize / 2.0) * Math.Cos(radians))));

    Y1 = Convert.ToSingle(AYUp + (AYSize / 2.0 + (int)((float)(AYSize / 2.0) * Math.Sin(radians))));

    XMaxSize = TitG.MeasureString(AreaText[i].Trim(), LSfont); //将绘制的字符串进行格式化

    SWidth = XMaxSize.Width; //获取字符串的宽度

    SHeight = XMaxSize.Height; //获取字符串的高度

    if ((temf + f / 2) * 360 > 90 && (temf + f / 2) * 360 <= 270)

    {

    X2 = X1 - Aline;

    TX1 = X2 - 1 - SWidth;

    TY1 = Y1 - SHeight / 2 - Asash;

    TX2 = SWidth;

    TY2 = SHeight + Asash * 2;

    g.FillRectangle(ATbrush, TX1, TY1, TX2, TY2); //绘制内矩形

    g.DrawRectangle(new Pen(Color.Black, 1), TX1, TY1, TX2, TY2); //绘制矩形

    g.DrawString(AreaText[i].Trim(), LSfont, Zbrush, new PointF(X2 - SWidth + Asash - 1, Y1 - SHeight / 2));

    }

    else

    {

    X2 = X1 + Aline;

    TX1 = X2 + 1;

    TY1 = Y1 - SHeight / 2 - Asash;

    TX2 = SWidth;

    TY2 = SHeight + Asash * 2;

    g.FillRectangle(ATbrush, TX1, TY1, TX2, TY2); //绘制内矩形

    g.DrawRectangle(new Pen(Color.Black, 1), TX1, TY1, TX2, TY2); //绘制矩形

    g.DrawString(AreaText[i].Trim(), LSfont, Zbrush, new PointF(X2 + Asash + 1, Y1 - SHeight / 2));

    }

    Y2 = Y1;

    g.DrawLine(new Pen(new SolidBrush(Color.Black), 1), X1, Y1, X2, Y2);

    TimeNum += f * 360;

    temf = temf + f;

    }

    }

    else

    return;

    }

    #endregion

    秘笈心法

    心法领悟015:使用DrawString方法实现水印文字。
    对于一些有可能侵权的图片,或者要作为宣传的图片,可以通过使用DrawString方法将用到的文字绘制到图片上,从而得到所谓的“水印文字”。

  • 来源:明日科技
  • 制作一个可以旋转的饼型图

    实例说明

    通过本实例绘制的饼型图可以直观的显示公司员工的性别比例,而且还可以通过单击“旋转”按钮使饼型图旋转起来。
    实例运行效果如图1所示。
    图1 制作一个可以旋转的饼型图

    关键技术

    本实例在实现时,首先通过Graphics类的FillEllipse方法和FillPie方法绘制饼型图,然后通过使用Timer组件控制饼型图的旋转。
    下面对本实例中用到的关键技术进行详细讲解。
    Timer组件表示一个计时器,它可以按用户定义的时间间隔来引发事件,引发的事件一般为周期性的,每隔若干秒或若干毫秒执行一次,其常用的属性、方法及事件如表1所示。
    表1 Timer组件的常用属性、方法及事件

    属性、方法及事件 说明
    Enabled属性 获取或设置计时器是否正在运行
    Interval属性 获取或设置在相对于上一次发生的Tick事件引发Tick事件之前的时间(以毫秒为单位)
    Start方法 启动计时器
    Stop方法 停止计时器
    Tick事件 当指定的计时器间隔已过去而且计时器处于启用状态时发生

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为RoundCaky。
    (2)更改默认窗体Form1的Name属性为Frm_Main,在该窗体中添加两个Panel控件,分别用来显示表示男女比例的饼型图和说明信息;添加两个Button控件,分别用来执行绘制饼型图和旋转饼型图操作;添加一个Timer组件,用来控制饼型图的旋转与停止。
    (3)程序主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    private void ShowPic(string SexCode, float f)// ShowPic方法用来绘制饼图
    {
    this.Controls.Add(panel1);//将Panel控件添加到窗体中
    panel1.Width = 230;//设置Panel控件的宽度
    panel1.Height = 230;//设置Panel控件的高度
    bt = new Bitmap(panel1.Width, panel1.Height);//创建画布
    Graphics g = Graphics.FromImage(bt);//创建Graphics对象
    Pen p = new Pen(new SolidBrush(Color.Blue));//创建画笔
    Point p1 = new Point(0, 0);//创建一个Point对象
    Size s = new Size(this.panel1.Width, this.panel1.Height);//创建Size对象
    Rectangle trct = new Rectangle(p1, s);//创建Rectangle对象
    g.FillEllipse(new SolidBrush(Color.Red), trct);//绘制椭圆
    g.FillPie(new SolidBrush(Color.Blue), trct, flag, f * 360);//绘制扇形
    bt1 = new Bitmap(panel2.Width, panel2.Height);//创建画布
    Graphics ginfo = Graphics.FromImage(bt1);//创建Graphics对象
    Font font = new Font("宋体", 10, FontStyle.Regular);//设置字体
    ginfo.DrawString(SexCode + " " + f.ToString().Substring(0, 4), font, new SolidBrush(Color.Blue), 0, 5);
    ginfo.DrawString("女" + " " + (1.0 - Convert.ToDouble(f.ToString().Substring(0, 4))).ToString().Substring(0, 4), font, new SolidBrush(Color.Red), 0, 25); //绘制性别及比率
    panel1.BackgroundImage = bt;//显示饼图
    panel2.BackgroundImage = bt1;//显示性别及比率
    }
    private void button1_Click(object sender, EventArgs e)//单击“显示”按钮显示饼图
    {
    Conn();//连接数据库
    using (cmd = new SqlCommand("SELECT sex,COUNT(sex) num FROM tb_sex group by sex", con))
    {
    SqlDataReader dr = cmd.ExecuteReader();//创建SqlDataReader对象
    string[] str = new string[2];
    int i = 0;
    while (dr.Read())//读取记录
    {
    str[i] = dr[0].ToString() + "," + dr[1].ToString();//获取数据库中存储的性别及比例
    i++;
    }
    float N = Convert.ToInt16(str[0].Substring(2)) + Convert.ToInt16(str[1].Substring(2)); //男女性别比例之和
    float f = Convert.ToInt16(str[0].Substring(2)) / N;//男性的比例
    flag = 180;//开始绘制的起始角度
    ShowPic(str[0].Substring(0, 1), f);//调用ShowPic方法绘制饼图
    }
    con.Close();
    }
    private void timer1_Tick(object sender, EventArgs e)//当单击“旋转”按钮时开始旋转饼图
    {
    flag += 1;//每次转动一度
    Conn();//连接数据库
    using (cmd = new SqlCommand("SELECT sex,COUNT(sex) num FROM tb_sex group by sex", con))
    {
    SqlDataReader dr = cmd.ExecuteReader();//创建SqlDataReader对象
    string[] str = new string[2];//声明数组存储性别及比例
    int i = 0;
    while (dr.Read())
    {
    str[i] = dr[0].ToString() + "," + dr[1].ToString();//获取数据库中存储的性别及比例
    i++;
    }
    float N = Convert.ToInt16(str[0].Substring(2)) + Convert.ToInt16(str[1].Substring(2)); //男女性别比例之和
    float f = Convert.ToInt16(str[0].Substring(2)) / N;//男性的比例
    ShowPic(str[0].Substring(0, 1), f);//调用ShowPic方法绘制饼图
    }
    con.Close();//关闭连接
    }
    private void button2_Click(object sender, EventArgs e)//“旋转”按钮
    {
    if (button2.Text == "旋转")//如果按钮显示“旋转”文本
    {
    timer1.Start();//开始Timer控件
    button2.Text = "停止";//将按钮的文本设为“停止”
    }
    else//如果按钮的文本为“停止”
    {
    timer1.Stop();//停止Timer控件
    button2.Text = "旋转";//将按钮的文本设为“旋转”
    }
    }

    秘笈心法

    心法领悟016:Timer计时器组件的使用。
    Timer组件是一个计时器组件,它主要用来按用户定义的时间间隔来引发事件,引发的事件一般为周期性的,每隔若干秒或若干毫秒执行一次。

    将存为文本的数字转换成数字

    包含存储为带有绿色三角形文本的数字的单元格 存储为文本的数字可能导致意外的结果。选择单元格,然后单击 Excel 错误警报按钮 选择转换选项。如果该按钮不可用,请执行以下操作。

    1. 选定列

    所选列 选择具有此问题的列。如果不想转换整列,可改为选择一个或多个单元格。只需确保所选单元格位于同一列中,否则此步骤不起作用。(如果多个列中出现此问题,请参阅下面的“其他转换方式”。)

    2.单击此按钮

    数据选项卡,分列按钮 “分列”按钮通常用于拆分列,但也可用于将单列文本转换为数字。在“数据”选项卡上单击“分列”。

    3.单击“完成”

    完成按钮 “分列”向导步骤的其余部分最适用于拆分列。由于只是转换列中的文本,随即可单击“完成”,Excel 将转换单元格。

    4. 设置格式

    选择的货币格式 按 CTRL+1(或 Mac 上的 MAC 命令按钮图标的图像 +1)。然后选择任意格式。 注意: 如果仍看到未显示为数字结果的公式,则可能已启用“显示公式”。转到“公式选项卡”,确保“显示公式”已关闭。

    其他转换方法:

    使用公式将文本转换为数字

    可使用 VALUE 函数仅返回文本的数值。

    1.插入新列

    文本数字旁边的新列 在带文本的单元格旁边插入新列。在本例中,列 E 包含存储为数字的文本。F 列是新列。

    2.使用 VALUE 函数

    包含公式:=VALUE(E23) 并且结果为 107.71 的单元格 F23 在新列的某个单元格中键入=VALUE(),然后在括号中键入包含作为数字存储的文本的单元格引用。在本示例中,它是单元格 E23

    3.将光标停放在此处

    光标停留在单元格右下角 现在将单元格的公式向下填充到其他单元格。如果以前从未执行过此操作,操作方式如下:将光标停放在单元格的右下角,直到它变为加号。

    4.单击并向下拖动

    向下拖动光标,在单元格中填入公式 单击并向下拖动,将公式填充到其他单元格。完成后,可使用此新列,也可将这些新值复制粘贴到原始列中。操作方式如下:选择包含新公式的单元格。按 CTRL+C。单击原始列的第一个单元格。然后在“开始”选项卡上,单击“粘贴”下的箭头,然后依次单击“选择性粘贴”>“”。

    使用选择性粘贴并相乘

    如果上述步骤不起作用,则可使用此方法,用在尝试转换多个文本列时。

    1. 选择没有此问题的空白单元格,在其中键入数字 1,然后按 Enter。
    2. 按 CTRL+C 复制单元格。
    3. 选择包含存储为文本的数字的单元格。
    4. 在“开始”选项卡上,单击“粘贴”>“选择性粘贴”。
    5. 单击“相乘”,然后单击“确定”。Excel 将每个单元格乘以 1,这样做可将文本转换为数字。
    6. 按 CTRL+1(或 Mac 上的 MAC 命令按钮图标的图像 +1)。然后选择任意格式。

    关闭绿色三角形

    可以阻止 Excel 为存储为文本的数字显示绿色三角形。转到“文件”>“选项”>“公式”,然后取消选中“设置为文本格式的数字…

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    :: 显示或者隐藏命令 //ECHO [ON | OFF]
    @ ECHO OFF
    REM 没有摄像头图标。

    :: 设置颜色为 淡蓝色背景色,白色前景色
    COLOR 9F

    :: 设置运行窗口标题
    TITLE 添加摄像头图标

    :: 申请提权
    net session >nul 2>&1
    if not "%errorLevel%" == "0" (
    echo 提示:此工具必须使用管理员权限运行!
    echo 它会弹出UAC对话框,请单击[是]继续。
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\\578635getadmin.vbs"
    echo UAC.ShellExecute "%~s0", "%*", "", "runas", 1 >> "%temp%\\578635getadmin.vbs"
    "%temp%\\578635getadmin.vbs"
    exit /b 2
    )

    ECHO.
    ::说明可能导致此问题的相关原因
    ECHO 主要症状:
    ECHO 摄像头图标消失、没有图标。
    ECHO 1.可能未安装摄像头软件。
    ECHO 2.可能注册表异常导致。
    ECHO 3.用户错误操作导致。
    ECHO 注意:此脚本将创建第三方摄像头软件
    ECHO =====================================

    :: 空一行
    :: ECHO.
    :: 获取当前相对路径
    set P=%~dp0
    :: echo 当前路径 ╞ %P% ╡

    :: 获取当前准确时间
    set T=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
    :: echo 当前时间 ╞ %T% ╡

    :: 显示系统信息
    ECHO ■■■■■■ 当前系统版本 ■■■■■■
    VER|FINDSTR /I "5.1" > nul && ECHO ■■■■■■ Windows XP ■■■■■■ && GOTO A
    VER|FINDSTR /I "6.1" > nul && ECHO ■■■■■■ Windows 7 ■■■■■■ && GOTO A
    VER|FINDSTR /I "6.2" > nul && ECHO ■■■■■■ Windows 8 ■■■■■■ && GOTO A
    VER|FINDSTR /I "6.3" > nul && ECHO ■■■■■■ Windows 8.1 ■■■■■■ && GOTO A

    wmic os get name
    :A
    ECHO "%PROCESSOR_ARCHITECTURE%"|FINDSTR /I "86" > nul && ECHO ■■■■■■ 32 位 ■■■■■■ && set X=32
    ECHO "%PROCESSOR_ARCHITECTURE%"|FINDSTR /I "64" > nul && ECHO ■■■■■■ 64 位 ■■■■■■ && set X=64

    :: 判断变量X的值,X为系统位数
    IF /I %X% EQU 64 (
    set exe="%ProgramFiles(X86)%\\MiniCapTool\\Cap.exe"
    set ico="%ProgramFiles(X86)%\\MiniCapTool\\Cap.ico"
    set dir="%ProgramFiles(X86)%\\MiniCapTool"
    ) ELSE (
    IF /I %X% EQU 32 (
    set exe="%ProgramFiles%\\MiniCapTool\\Cap.exe"
    set ico="%ProgramFiles%\\MiniCapTool\\Cap.ico"
    set dir="%ProgramFiles%\\MiniCapTool"
    ) ELSE (
    set exe="%systemdrive%\\Program Files\\MiniCapTool\\Cap.exe"
    set ico="%systemdrive%\\Program Files\\MiniCapTool\\Cap.ico"
    set dir="%systemdrive%\\Program Files\\MiniCapTool"
    )
    )

    :: 获取当前状态
    ECHO.
    ECHO 正在检测当前状态...
    ECHO.
    :: 判断文件是否存在
    IF EXIST %exe% (
    echo 发现存在摄像头软件. 路径 && echo %exe%
    ) ELSE (
    echo 未发现摄像头软件.
    )

    :: 检查注册表
    REG QUERY HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID\\{AC000000-AC00-AC00-AC00-100000000008} /ve >nul 2>nul
    :: 判断返回码状态
    IF /I %errorlevel% EQU 0 (
    ECHO 检测到注册表有残留.
    ) ELSE (
    IF /I %errorlevel% EQU 1 (
    ECHO 未发现注册表残留.
    ) ELSE (
    ECHO 出现未知错误.
    )
    )

    ECHO.
    ::信息提示并作出选择
    ::暂不使用此句 CHOICE /C YN /T 10 /D Y /M "您好,键入 Y 执行修复,N 退出,如未操作,默认十秒后自动执行修复。
    set /P IS=您好,键入1执行添加、修复,2移除,3退出。(输入错误将直接退出) 输入后回车:
    ::判断输入的字符
    ::暂不使用此句 IF ERRORLEVEL 2 (EXIT) ELSE (GOTO R)
    IF /I %IS% EQU 1 (
    ECHO 开始修复 && GOTO Install
    ) ELSE (
    IF /I %IS% EQU 2 (
    ECHO 开始移除 && GOTO uninstall
    ) ELSE (
    IF /I %IS% EQU 3 (
    EXIT
    ) ELSE (
    ECHO 输入错误,按任意键退出。&& pause>nul && EXIT
    )
    )
    )

    REM ----------------------------------------------------------------------------------------------------------

    :Install
    ECHO.
    :: 备份注册表
    ECHO ▁▂▃▄▅▆▇█ 备份注册表 █▇▆▅▄▃▂▁
    ECHO.
    :: 创建目录
    MKDIR %TEMP%\\%T% > nul
    IF /I %errorlevel% EQU 0 (
    ECHO 备份目录 %TEMP%\\%T% 创建成功.
    ) ELSE (
    ECHO 创建备份目录 %TEMP%\\%T% 出错. && ECHO 按任意键退出. && pause>nul && EXIT
    )
    :: 导出注册表项、值
    REG EXPORT HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID\\{AC000000-AC00-AC00-AC00-100000000008} %TEMP%\\%T%\\HKCM-CLSID-AC000.reg
    REG EXPORT HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{AC000000-AC00-AC00-AC00-100000000008} %TEMP%\\%T%\\HKCM-NameSpace-CLSID-AC000.reg
    ::REG EXPORT 注册表项 %TEMP%\\%T%\\导出的名称

    ECHO 注册表备份完毕,位置 %TEMP%\\%T%\
    ECHO.
    ECHO ━━━━━━━━━━━━━━━━━━━━

    ECHO.
    ECHO ▁▂▃▄▅▆▇█ 安装摄像头软件 █▇▆▅▄▃▂▁
    ECHO.
    ECHO 安装位置 %dir%
    :: 创建目录
    MKDIR %dir%

    :: 复制文件、目录到系统软件安装目录
    COPY /y "%P%\\MiniCapTool\\Cap.exe" %exe%
    COPY /y "%P%\\MiniCapTool\\Cap.ico" %ico%

    ECHO.
    ECHO ━━━━━━━━━━━━━━━━━━━━━━

    ECHO.
    :: 修复注册表
    ECHO ▁▂▃▄▅▆▇█ 修复注册表 █▇▆▅▄▃▂▁
    ECHO.
    :: 安装
    REM ECHO Windows Registry Editor Version 5.00 > %TEMP%\\%T%\\add.reg
    REM ECHO. >> %TEMP%\\%T%\\add.reg
    REM ECHO [HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID\\{AC000000-AC00-AC00-AC00-100000000008}] >> %TEMP%\\%T%\\add.reg
    REM ECHO @="USB 视频设备" >> %TEMP%\\%T%\\add.reg
    REM ECHO. >> %TEMP%\\%T%\\add.reg
    REM ECHO [HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID\\{AC000000-AC00-AC00-AC00-100000000008}\\DefaultIcon] >> %TEMP%\\%T%\\add.reg
    REM ECHO @="\\%ico%" >> %TEMP%\\%T%\\add.reg
    REM ECHO. >> %TEMP%\\%T%\\add.reg
    REM ECHO [HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID\\{AC000000-AC00-AC00-AC00-100000000008}\\shell\\Open\\Command] >> %TEMP%\\%T%\\add.reg
    REM ECHO @="\\%exe%" >> %TEMP%\\%T%\\add.reg
    REM ECHO. >> %TEMP%\\%T%\\add.reg
    REM ECHO [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{AC000000-AC00-AC00-AC00-100000000008}] >> %TEMP%\\%T%\\add.reg
    REM ECHO @="USB 视频设备" >> %TEMP%\\%T%\\add.reg

    REM :: 导入注册表文件
    REM regedit /s %TEMP%\\%T%\\add.reg

    REG ADD HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID\\{AC000000-AC00-AC00-AC00-100000000008} /ve /t REG_SZ /d "USB 视频设备" /f
    REG ADD HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID\\{AC000000-AC00-AC00-AC00-100000000008}\\DefaultIcon /ve /t REG_SZ /d %ico% /f
    REG ADD HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID\\{AC000000-AC00-AC00-AC00-100000000008}\\shell /ve /f
    REG DELETE HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID\\{AC000000-AC00-AC00-AC00-100000000008}\\shell /va /f
    REG ADD HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID\\{AC000000-AC00-AC00-AC00-100000000008}\\shell\\Open /ve /f
    REG DELETE HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID\\{AC000000-AC00-AC00-AC00-100000000008}\\shell\\Open /va /f
    REG ADD HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID\\{AC000000-AC00-AC00-AC00-100000000008}\\shell\\Open\\Command /ve /t REG_SZ /d %exe% /f

    REG ADD HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{AC000000-AC00-AC00-AC00-100000000008} /ve /t REG_SZ /d "USB 视频设备" /f

    :: 判断执行状态
    IF /I %errorlevel% EQU 0 (
    ECHO 操作已成功完成..
    ) ELSE (
    IF /I %errorlevel% EQU 1 (
    ECHO 请尝试使用管理员身份运行脚本程序.
    ) ELSE (
    IF /I %errorlevel% EQU 3 (
    ECHO 注册表文件 没有找到.
    ) ELSE (
    ECHO 出现未知错误.)
    )
    )
    ECHO.
    ECHO ━━━━━━━━━━━━━━━━━━━━━━

    :: 结束
    GOTO END

    :uninstall
    ECHO.
    ECHO ▁▂▃▄▅▆▇█ 删除摄像头软件 █▇▆▅▄▃▂▁
    ECHO.
    :: 删除文件
    ECHO 正在删除摄像头软件...
    ECHO 卸载位置 %dir%
    RMDIR /S /Q %dir%
    ECHO.
    ECHO ━━━━━━━━━━━━━━━━━━━━━━

    ECHO.
    ECHO ▁▂▃▄▅▆▇█ 清理注册表 █▇▆▅▄▃▂▁
    ECHO.
    :: 删除注册表
    REM ECHO 正在清理注册表残留...
    REM ECHO Windows Registry Editor Version 5.00 > %TEMP%\\%T%\\remove.reg
    REM ECHO. >> %TEMP%\\%T%\\remove.reg
    REM ECHO [-HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID\\{AC000000-AC00-AC00-AC00-100000000008}] >> %TEMP%\\%T%\\remove.reg
    REM ECHO. >> %TEMP%\\%T%\\remove.reg
    REM ECHO [-HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{AC000000-AC00-AC00-AC00-100000000008}] >> %TEMP%\\%T%\\remove.reg

    REM :: 导入注册表文件
    REM regedit /s %TEMP%\\%T%\\remove.reg

    REG DELETE HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID\\{AC000000-AC00-AC00-AC00-100000000008} /f
    REG DELETE HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{AC000000-AC00-AC00-AC00-100000000008} /f

    :: 判断执行状态
    REM IF /I %errorlevel% EQU 0 (
    REM ECHO 操作已成功完成..
    REM ) ELSE (
    REM IF /I %errorlevel% EQU 1 (
    REM ECHO 请尝试使用管理员身份运行脚本程序.
    REM ) ELSE (
    REM IF /I %errorlevel% EQU 3 (
    REM ECHO 注册表文件 没有找到.
    REM ) ELSE (
    REM ECHO 出现未知错误.)
    REM )
    REM )
    ECHO.
    ECHO ━━━━━━━━━━━━━━━━━━━━━━

    :: 结束标签
    :END
    :: 等待按键继续
    ECHO .......................................................................
    echo 操作完毕.
    pause>nul

    第三方摄像头_脚本.zip

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    :: 显示或者隐藏命令 //ECHO [ON | OFF]
    @ ECHO OFF
    REM 摄像头无法正常打开。

    :: 设置颜色为 淡蓝色背景色,白色前景色
    COLOR 9F

    :: 设置运行窗口标题
    TITLE 摄像头异常

    :: 提示以管理员身份运行
    ECHO ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    ECHO ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
    ECHO ☆ ☆
    ECHO ☆ 为了能够成功修复,请使用管理员身份运行 [鼠标右键单击--以管理员身份运行] ☆
    ECHO ☆ ☆
    ECHO ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

    ECHO.
    ::说明可能导致此问题的相关原因
    ECHO 主要症状:
    ECHO 摄像头无法使用。
    ECHO 1.可能由于注册表异常导致。
    ECHO 2.可能相关组件导致异常。
    ECHO 3.可能由于摄像头驱动程序导致异常。
    ECHO 4. ...........
    ECHO =====================================

    :: 空一行
    ECHO.
    :: 获取当前相对路径
    set P=%~dp0
    echo 当前路径 ╞ %P% ╡

    :: 获取当前准确时间
    set T=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
    echo 当前时间 ╞ %T% ╡

    ECHO.
    ::信息提示并作出选择
    ::暂不使用此句 CHOICE /C YN /T 10 /D Y /M "您好,键入 Y 执行修复,N 退出,如未操作,默认十秒后自动执行修复。
    set /P IS=您好,键入 Y 执行修复,N 退出。(不区分大小写,输入错误将直接退出) 输入后回车
    ::判断输入的字符
    ::暂不使用此句 IF ERRORLEVEL 2 (EXIT) ELSE (GOTO R)
    IF /I %IS% EQU Y (ECHO 开始修复) ELSE (EXIT)

    :: 显示系统信息
    ECHO.
    ECHO ■■■■■■ 当前系统版本 ■■■■■■
    VER|FINDSTR /I "5.1" > nul && ECHO ■■■■■■ Windows XP ■■■■■■
    VER|FINDSTR /I "6.1" > nul && ECHO ■■■■■■ Windows 7 ■■■■■■
    VER|FINDSTR /I "6.2" > nul && ECHO ■■■■■■ Windows 8 ■■■■■■
    VER|FINDSTR /I "6.3" > nul && ECHO ■■■■■■ Windows 8.1 ■■■■■■

    ECHO "%PROCESSOR_ARCHITECTURE%"|FINDSTR /I "86" > nul && ECHO ■■■■■■ 32 位 ■■■■■■
    ECHO "%PROCESSOR_ARCHITECTURE%"|FINDSTR /I "64" > nul && ECHO ■■■■■■ 64 位 ■■■■■■

    ECHO.
    :: 备份注册表
    ECHO ▁▂▃▄▅▆▇█ 备份注册表 █▇▆▅▄▃▂▁
    ECHO.
    :: 创建目录
    MKDIR %TEMP%\\%T% > nul
    IF /I %errorlevel% EQU 0 (
    ECHO 备份目录 %TEMP%\\%T% 创建成功.
    ) ELSE (
    ECHO 创建备份目录 %TEMP%\\%T% 出错. && ECHO 按任意键退出. && pause>nul && EXIT
    )
    :: 导出注册表项、值
    REG EXPORT HKEY_CLASSES_ROOT\\CLSID\\{62BE5D10-60EB-11d0-BD3B-00A0C911CE86} %TEMP%\\%T%\\HKCR-CLSID-62BE5.reg
    REG EXPORT HKEY_CLASSES_ROOT\\Wow6432Node\\CLSID\\{62BE5D10-60EB-11d0-BD3B-00A0C911CE86} %TEMP%\\%T%\\HKCR-Wow6432Node-CLSID-62BE5.reg

    REG EXPORT HKEY_CLASSES_ROOT\\CLSID\\{DA4E3DA0-D07D-11d0-BD50-00A0C911CE86} %TEMP%\\%T%\\HKCR-CLSID-DA4E3.reg
    REG EXPORT HKEY_CLASSES_ROOT\\Wow6432Node\\CLSID\\{DA4E3DA0-D07D-11d0-BD50-00A0C911CE86} %TEMP%\\%T%\\HKCR-Wow6432Node-CLSID-DA4E3.reg

    REG EXPORT HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\Class\\{6BDD1FC6-810F-11D0-BEC7-08002BE2092F} %TEMP%\\%T%\\HKLM-6BDD1.reg
    ::REG EXPORT 注册表项 %TEMP%\\%T%\\导出的名称

    ECHO 注册表备份完毕,位置 %TEMP%\\%T%\
    ECHO.
    ECHO ━━━━━━━━━━━━━━━━━━━━

    ECHO.
    :: 修复注册表
    ECHO ▁▂▃▄▅▆▇█ 重置注册表 █▇▆▅▄▃▂▁
    ECHO.
    :: 删除注册表项、值
    REG DELETE "HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\Class\\{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}" /v "UpperFilters" /f
    :: 添加注册表项、值
    REG ADD "HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\Class\\{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}" /v "UpperFilters" /t REG_MULTI_SZ /d "" /f
    ECHO.
    ECHO ━━━━━━━━━━━━━━━━━━━━

    ECHO.
    :: 注册 Quartz.dll Proppage.dll directSpy.dll
    ECHO ▁▂▃▄▅▆▇█ 注册 dll 组件 █▇▆▅▄▃▂▁
    ECHO.
    :: devenum.dll
    regsvr32 /s devenum.dll
    IF /I %errorlevel% EQU 0 (
    ECHO 注册 devenum.dll 成功.
    ) ELSE (
    IF /I %errorlevel% EQU 5 (
    ECHO 注册 devenum.dll 所需的权限需要提升.
    ) ELSE (
    IF /I %errorlevel% EQU 3 (
    ECHO 文件 devenum.dll 没有找到.
    ) ELSE (
    ECHO 注册 devenum.dll 出现未知错误.)
    )
    )
    :: msdmo.dll
    regsvr32 /s msdmo.dll
    IF /I %errorlevel% EQU 0 (
    ECHO 注册 msdmo.dll 成功.
    ) ELSE (
    IF /I %errorlevel% EQU 5 (
    ECHO 注册 msdmo.dll 所需的权限需要提升.
    ) ELSE (
    IF /I %errorlevel% EQU 3 (
    ECHO 文件 msdmo.dll 没有找到.
    ) ELSE (
    ECHO 注册 msdmo.dll 出现未知错误.)
    )
    )
    :: avicap32.dll
    regsvr32 /s avicap32.dll
    IF /I %errorlevel% EQU 0 (
    ECHO 注册 avicap32.dll 成功.
    ) ELSE (
    IF /I %errorlevel% EQU 5 (
    ECHO 注册 avicap32.dll 所需的权限需要提升.
    ) ELSE (
    IF /I %errorlevel% EQU 3 (
    ECHO 文件 avicap32.dll 没有找到.
    ) ELSE (
    ECHO 注册 avicap32.dll 出现未知错误.)
    )
    )
    :: msvfw32.dll
    regsvr32 /s msvfw32.dll
    IF /I %errorlevel% EQU 0 (
    ECHO 注册 msvfw32.dll 成功.
    ) ELSE (
    IF /I %errorlevel% EQU 5 (
    ECHO 注册 msvfw32.dll 所需的权限需要提升.
    ) ELSE (
    IF /I %errorlevel% EQU 3 (
    ECHO 文件 msvfw32.dll 没有找到.
    ) ELSE (
    ECHO 注册 msvfw32.dll 出现未知错误.)
    )
    )
    :: Quartz.dll
    regsvr32 /s Quartz.dll
    IF /I %errorlevel% EQU 0 (
    ECHO 注册 Quartz.dll 成功.
    ) ELSE (
    IF /I %errorlevel% EQU 5 (
    ECHO 注册 Quartz.dll 所需的权限需要提升.
    ) ELSE (
    IF /I %errorlevel% EQU 3 (
    ECHO 文件 Quartz.dll 没有找到.
    ) ELSE (
    ECHO 注册 Quartz.dll 出现未知错误.)
    )
    )
    :: Proppage.dll
    regsvr32 /s Proppage.dll
    IF /I %errorlevel% EQU 0 (
    ECHO 注册 Proppage.dll 成功.
    ) ELSE (
    IF /I %errorlevel% EQU 5 (
    ECHO 注册 Proppage.dll 所需的权限需要提升.
    ) ELSE (
    IF /I %errorlevel% EQU 3 (
    ECHO 文件 Proppage.dll 没有找到.
    ) ELSE (
    ECHO 注册 Proppage.dll 出现未知错误.)
    )
    )
    :: directSpy.dll
    regsvr32 /s directSpy.dll
    IF /I %errorlevel% EQU 0 (
    ECHO 注册 directSpy.dll 成功.
    ) ELSE (
    IF /I %errorlevel% EQU 5 (
    ECHO 注册 directSpy.dll 所需的权限需要提升.
    ) ELSE (
    IF /I %errorlevel% EQU 3 (
    ECHO 文件 directSpy.dll 没有找到.
    ) ELSE (
    ECHO 注册 directSpy.dll 出现未知错误.)
    )
    )
    ECHO.
    ECHO ━━━━━━━━━━━━━━━━━━━━━━

    ECHO.
    :: 启动 Windows Image Acquisition (WIA) 服务
    ECHO ▁▂▃▄▅▆▇█ 启动 Windows Image Acquisition (WIA) 服务 █▇▆▅▄▃▂▁
    ECHO.
    :: net start 命令启动 stisvc 服务
    net start stisvc

    :: 设置 stisvc 服务为自启动
    sc config stisvc start= auto

    :: 再次启动 stisvc 服务使用 sc start 命令
    sc start stisvc
    ECHO.
    ECHO ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


    :: 等待按键继续
    ECHO .......................................................................
    echo 操作完毕.
    pause>nul

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    ::┌──────────────────────────┐
    ::│ 故障还原方案 │
    ::│ 文件错误关联问题 │
    ::└──────────────────────────┘
    :: 显示或者隐藏命令 //ECHO [ON | OFF]
    @ ECHO OFF
    REM 对 lnk 和 exe 文件的错误关联问题进行分析
    :: 设置颜色为 淡蓝色背景色,白色前景色
    COLOR 9F
    :: 设置运行窗口标题
    TITLE 文件错误关联问题--演示
    :: 提示以管理员身份运行
    ECHO ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    ECHO ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
    ECHO ☆ ☆
    ECHO ☆ 为了能够成功演示,请使用管理员身份运行 [鼠标右键单击--以管理员身份运行] ☆
    ECHO ☆ ☆
    ECHO ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
    :: 显示标语信息
    ECHO ╔═══════════════════════════════╗
    ECHO ║ _____糖糖-测试 ------------------------------------------- ║
    ECHO ╚═══════════════════════════════╝

    :: 说明可能导致此问题的相关原因
    ECHO.
    ECHO 主要症状:
    ECHO.
    ECHO 桌面多数或全部快捷方式图标变成了某一个相同的图标,exe文件无法运行。
    ECHO.
    ECHO 1.可能由于注册表异常导致。
    ECHO.
    ECHO 2.缓存过旧导致的异常。
    ECHO.
    ECHO =====================================

    :: 空一行
    ECHO.
    :: 获取当前相对路径
    set P=%~dp0
    echo 当前路径 ╞ %P% ╡

    :: 获取当前准确时间
    set T=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
    echo 当前时间 ╞ %T% ╡

    :: 空一行
    ECHO.
    :: 检测系统版本,如果需要并跳转到相应的系统标签处进行执行
    VER|FINDSTR /I "5.1" && GOTO XP || GOTO Win7

    :: XP 系统的方案
    :XP

    :: 信息提示并作出选择
    :: 暂不使用此句 CHOICE /C YN /T 10 /D Y /M "您好,键入 Y 执行修复,N 退出,如未操作,默认十秒后自动执行修复。
    set /P IS=您好,键入 Y 执行修复,N 退出。(不区分大小写,输入错误将直接退出) 输入后回车
    :: 判断输入的字符
    :: 暂不使用此句 IF ERRORLEVEL 2 (EXIT) ELSE (GOTO R)
    IF /I %IS% EQU Y (ECHO 记录状态) ELSE (EXIT)

    :: 判断当前状态 0-1 ;写入注册表值,记录当前运行状态
    REG QUERY HKEY_CURRENT_USER\\Software\\FileExts_Test /ve 1>nul 2>nul
    :: 判断返回码是否为 1 (命令执行失败)
    IF ERRORLEVEL 1 (
    REG ADD "HKEY_CURRENT_USER\\Software\\FileExts_Test" /ve /f
    TITLE 文件错误关联问题--制造故障中...
    GOTO XP_C
    ) ELSE (
    REG DELETE "HKEY_CURRENT_USER\\Software\\FileExts_Test" /f
    TITLE 文件错误关联问题--修复故障中...
    GOTO XP_R
    )

    :: Win7 系统的方案
    :Win7

    :: 信息提示并作出选择
    CHOICE /C YN /T 10 /D Y /M "您好,键入 Y 执行修复,N 退出,如未操作,默认十秒后自动执行修复。
    :: 暂不使用此句 set /P IS=您好,键入 Y 执行修复,N 退出。(不区分大小写,输入错误将直接退出) 输入后回车
    :: 判断输入的字符
    IF ERRORLEVEL 2 (EXIT) ELSE (ECHO 记录状态)
    :: 暂不使用此句 IF /I %IS% EQU Y (GOTO R) ELSE (EXIT)

    :: 判断当前状态 0-1 ;写入注册表值,记录当前运行状态
    REG QUERY HKEY_CURRENT_USER\\Software\\FileExts_Test /ve 1>nul 2>nul
    :: 判断返回码是否为 1 (命令执行失败)
    IF ERRORLEVEL 1 (
    REG ADD "HKEY_CURRENT_USER\\Software\\FileExts_Test" /ve /f
    TITLE 文件错误关联问题--制造故障中...
    GOTO Win7_C
    ) ELSE (
    REG DELETE "HKEY_CURRENT_USER\\Software\\FileExts_Test" /f
    TITLE 文件错误关联问题--修复故障中...
    GOTO Win7_R
    )

    ::*****************************************************************************************

    :: 标签XP_C 制造故障
    :XP_C

    ECHO.
    ECHO /////////////////////////////////
    ECHO //如遇到安全软件拦截请解除拦截。/
    ECHO /////////////////////////////////
    :: 使用REG命令对注册表进行操作

    :: 首先执行备份至临时目录
    ECHO.
    ECHO ■■■■ 备份注册表 ■■■■
    ECHO ┌────────────┐

    ECHO 备份路径 - %TEMP%
    REG EXPORT HKCR\\.exe %TEMP%\\%T%_HKCR.exe.reg
    REG EXPORT HKCR\\.lnk %TEMP%\\%T%_HKCR.lnk.reg
    REG EXPORT HKCR\\exefile %TEMP%\\%T%_HKCR.exefile.reg
    REG EXPORT HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk %TEMP%\\%T%_HKCU.lnk.reg
    REG EXPORT HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe %TEMP%\\%T%_HKCU.exe.reg

    ECHO └────────────┘
    ECHO ☆☆注册表备份完毕☆☆
    ECHO.
    ECHO ■■■■ 篡改注册表 ■■■■
    ECHO ┌────────────┐

    :: HKEY_CLASSES_ROOT\\exefile
    REG DELETE "HKEY_CLASSES_ROOT\\exefile\\DefaultIcon" /f
    REG ADD "HKEY_CLASSES_ROOT\\exefile\\DefaultIcon" /ve /t REG_SZ /d "%%1" /f

    :: 设置变量并赋值
    set exe=""""%%1""" %%*"
    REG DELETE "HKEY_CLASSES_ROOT\\exefile\\shell\\open" /f
    REG DELETE "HKEY_CLASSES_ROOT\\exefile\\shell\\runas" /f
    REG ADD "HKEY_CLASSES_ROOT\\exefile\\shell\\open\\command" /ve /t REG_SZ /d %exe% /f
    REG ADD "HKEY_CLASSES_ROOT\\exefile\\shell\\open\\command" /v "IsolatedCommand" /t REG_SZ /d %exe% /f
    REG ADD "HKEY_CLASSES_ROOT\\exefile\\shell\\runas\\command" /ve /t REG_SZ /d %exe% /f
    REG ADD "HKEY_CLASSES_ROOT\\exefile\\shell\\runas\\command" /v "IsolatedCommand" /t REG_SZ /d %exe% /f

    :: HKEY_CLASSES_ROOT\\.exe
    REG ADD "HKEY_CLASSES_ROOT\\.exe" /ve /t REG_SZ /d "lnkfile" /f
    ::assoc.exe=exefile

    :: HKEY_CLASSES_ROOT\\.lnk
    REG ADD "HKEY_CLASSES_ROOT\\.lnk" /ve /t REG_SZ /d "exefile" /f
    ::assoc.lnk=lnkfile

    :: HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk" /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\OpenWithProgids" /ve /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\Openwithlist" /ve /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\OpenWithProgids" /va /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\Openwithlist" /va /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\UserChoice" /ve /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\UserChoice" /va /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\UserChoice" /v "Progid" /t REG_SZ /d "Applications\\iexplore.exe" /f

    :: HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe" /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\OpenWithProgids" /ve /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\Openwithlist" /ve /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\OpenWithProgids" /va /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\Openwithlist" /va /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\UserChoice" /ve /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\UserChoice" /va /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\UserChoice" /v "Progid" /t REG_SZ /d "Applications\\notepad.exe" /f

    :: REG DELETE "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ShellIcons" /f

    :: 判断图标缓存文件 IconCache.db 是否存在 ,是则删除文件
    :: 针对 XP 等系统
    IF EXIST "%USERPROFILE%\\LocalSettings\\Application Data\\IconCache.db" (DEL /F /Q /A "%USERPROFILE%\\LocalSettings\\Application Data\\IconCache.db") ELSE (ECHO 未发现图标缓存文件)

    :: 重启 explorer 进程
    :: 强制结束 资源管理器 explorer 进程
    TASKKILL /IM explorer.exe /F
    :: 延时
    ECHO 三秒后自动启动 explorer 进程
    PING 127.0.0.1 -N 3 1>nul 2>nul
    :: 启动 资源管理器 explorer 进程
    start "" "explorer.exe"

    ECHO └────────────┘
    ECHO ☆☆注册表篡改完成☆☆
    ECHO.
    :: 等待按键继续
    ECHO .......................................................................
    echo 操作完毕,请查看故障是否制造成功 - 再次运行执行修复.
    pause>nul

    :: 标签XP_R 进行修复
    :XP_R

    ECHO.
    ECHO /////////////////////////////////
    ECHO //如遇到安全软件拦截请解除拦截。/
    ECHO /////////////////////////////////
    :: 使用REG命令对注册表进行操作

    :: 首先执行备份至临时目录
    ECHO.
    ECHO ■■■■ 备份注册表 ■■■■
    ECHO ┌────────────┐

    ECHO 备份路径 - %TEMP%
    REG EXPORT HKCR\\.exe %TEMP%\\%T%_HKCR.exe.reg
    REG EXPORT HKCR\\.lnk %TEMP%\\%T%_HKCR.lnk.reg
    REG EXPORT HKCR\\exefile %TEMP%\\%T%_HKCR.exefile.reg
    REG EXPORT HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk %TEMP%\\%T%_HKCU.lnk.reg
    REG EXPORT HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe %TEMP%\\%T%_HKCU.exe.reg

    ECHO └────────────┘
    ECHO ☆☆注册表备份完毕☆☆
    ECHO.
    ECHO ■■■■ 修复注册表 ■■■■
    ECHO ┌────────────┐

    :: HKEY_CLASSES_ROOT\\exefile
    REG DELETE "HKEY_CLASSES_ROOT\\exefile\\DefaultIcon" /f
    REG ADD "HKEY_CLASSES_ROOT\\exefile\\DefaultIcon" /ve /t REG_SZ /d "%%1" /f

    :: 设置变量并赋值
    set exe=""""%%1""" %%*"
    REG DELETE "HKEY_CLASSES_ROOT\\exefile\\shell\\open" /f
    REG DELETE "HKEY_CLASSES_ROOT\\exefile\\shell\\runas" /f
    REG ADD "HKEY_CLASSES_ROOT\\exefile\\shell\\open\\command" /ve /t REG_SZ /d %exe% /f
    REG ADD "HKEY_CLASSES_ROOT\\exefile\\shell\\open\\command" /v "IsolatedCommand" /t REG_SZ /d %exe% /f
    REG ADD "HKEY_CLASSES_ROOT\\exefile\\shell\\runas\\command" /ve /t REG_SZ /d %exe% /f
    REG ADD "HKEY_CLASSES_ROOT\\exefile\\shell\\runas\\command" /v "IsolatedCommand" /t REG_SZ /d %exe% /f

    :: HKEY_CLASSES_ROOT\\.exe
    REG ADD "HKEY_CLASSES_ROOT\\.exe" /ve /t REG_SZ /d "exefile" /f
    assoc.exe=exefile

    :: HKEY_CLASSES_ROOT\\.lnk
    REG ADD "HKEY_CLASSES_ROOT\\.lnk" /ve /t REG_SZ /d lnkfile /f
    assoc.lnk=lnkfile

    :: HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\UserChoice" /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk" /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\OpenWithProgids" /ve /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\Openwithlist" /ve /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\OpenWithProgids" /va /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\Openwithlist" /va /f

    :: HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\UserChoice" /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe" /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\OpenWithProgids" /ve /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\Openwithlist" /ve /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\OpenWithProgids" /va /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\Openwithlist" /va /f

    :: REG DELETE "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ShellIcons" /f

    :: 判断图标缓存文件 IconCache.db 是否存在 ,是则删除文件
    :: 针对 XP 等系统
    IF EXIST "%USERPROFILE%\\LocalSettings\\Application Data\\IconCache.db" (DEL /F /Q /A "%USERPROFILE%\\LocalSettings\\Application Data\\IconCache.db") ELSE (ECHO 未发现图标缓存文件)

    :: 重启 explorer 进程
    :: 强制结束 资源管理器 explorer 进程
    TASKKILL /IM explorer.exe /F
    :: 延时
    ECHO 三秒后自动启动 explorer 进程
    PING 127.0.0.1 -N 3 1>nul 2>nul
    :: 启动 资源管理器 explorer 进程
    start "" "explorer.exe"

    ECHO └────────────┘
    ECHO ☆☆注册表修复完成☆☆
    ECHO.
    :: 等待按键继续
    ECHO .......................................................................
    echo 操作完毕,请查看是否已经修复.
    pause>nul

    ::****************************************************************************************
    ::****************************************************************************************

    :: 标签Win7_C 制造故障
    :Win7_C

    ECHO.
    ECHO /////////////////////////////////
    ECHO //如遇到安全软件拦截请解除拦截。/
    ECHO /////////////////////////////////
    :: 使用REG命令对注册表进行操作

    :: 首先执行备份至临时目录
    ECHO.
    ECHO ■■■■ 备份注册表 ■■■■
    ECHO ┌────────────┐

    ECHO 备份路径 - %TEMP%
    REG EXPORT HKCR\\.exe %TEMP%\\%T%_HKCR.exe.reg /y
    REG EXPORT HKCR\\.lnk %TEMP%\\%T%_HKCR.lnk.reg /y
    REG EXPORT HKCR\\exefile %TEMP%\\%T%_HKCR.exefile.reg /y
    REG EXPORT HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk %TEMP%\\%T%_HKCU.lnk.reg /y
    REG EXPORT HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe %TEMP%\\%T%_HKCU.exe.reg /y

    ECHO └────────────┘
    ECHO ☆☆注册表备份完毕☆☆
    ECHO.
    ECHO ■■■■ 篡改注册表 ■■■■
    ECHO ┌────────────┐

    :: HKEY_CLASSES_ROOT\\exefile
    REG DELETE "HKEY_CLASSES_ROOT\\exefile\\DefaultIcon" /f
    REG ADD "HKEY_CLASSES_ROOT\\exefile\\DefaultIcon" /ve /t REG_SZ /d "%%1" /f

    :: 设置变量并赋值
    set exe=""""%%1""" %%*"
    REG DELETE "HKEY_CLASSES_ROOT\\exefile\\shell\\open" /f
    REG DELETE "HKEY_CLASSES_ROOT\\exefile\\shell\\runas" /f
    REG ADD "HKEY_CLASSES_ROOT\\exefile\\shell\\open\\command" /ve /t REG_SZ /d %exe% /f
    REG ADD "HKEY_CLASSES_ROOT\\exefile\\shell\\open\\command" /v "IsolatedCommand" /t REG_SZ /d %exe% /f
    REG ADD "HKEY_CLASSES_ROOT\\exefile\\shell\\runas\\command" /ve /t REG_SZ /d %exe% /f
    REG ADD "HKEY_CLASSES_ROOT\\exefile\\shell\\runas\\command" /v "IsolatedCommand" /t REG_SZ /d %exe% /f

    :: HKEY_CLASSES_ROOT\\.exe
    REG ADD "HKEY_CLASSES_ROOT\\.exe" /ve /t REG_SZ /d "lnkfile" /f
    ::assoc.exe=exefile

    :: HKEY_CLASSES_ROOT\\.lnk
    REG ADD "HKEY_CLASSES_ROOT\\.lnk" /ve /t REG_SZ /d "exefile" /f
    ::assoc.lnk=lnkfile

    :: HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk" /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\OpenWithProgids" /ve /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\Openwithlist" /ve /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\OpenWithProgids" /va /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\Openwithlist" /va /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\UserChoice" /ve /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\UserChoice" /va /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\UserChoice" /v "Progid" /t REG_SZ /d "Applications\\iexplore.exe" /f

    :: HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe" /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\OpenWithProgids" /ve /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\Openwithlist" /ve /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\OpenWithProgids" /va /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\Openwithlist" /va /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\UserChoice" /ve /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\UserChoice" /va /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\UserChoice" /v "Progid" /t REG_SZ /d "Applications\\notepad.exe" /f

    :: REG DELETE "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ShellIcons" /f

    :: 判断图标缓存文件 IconCache.db 是否存在 ,是则删除文件
    :: 针对 Win7 等系统
    IF EXIST "%USERPROFILE%\\AppData\\Local\\IconCache.db" (DEL /F /Q /A "%USERPROFILE%\\AppData\\Local\\IconCache.db") ELSE (ECHO 未发现图标缓存文件)

    :: 重启 explorer 进程
    :: 强制结束 资源管理器 explorer 进程
    TASKKILL /IM explorer.exe /F
    :: 延迟操作
    ECHO 3 秒后自动启动 explorer 进程
    TIMEOUT 3
    :: 启动 资源管理器 explorer 进程
    start "" "explorer.exe"

    ECHO └────────────┘
    ECHO ☆☆注册表篡改完成☆☆
    ECHO.
    :: 等待按键继续
    ECHO .......................................................................
    echo 操作完毕,请查看故障是否制造成功 - 再次运行执行修复.
    pause>nul

    :: 标签Win7_R 进行修复
    :Win7_R

    ECHO.
    ECHO /////////////////////////////////
    ECHO //如遇到安全软件拦截请解除拦截。/
    ECHO /////////////////////////////////
    :: 使用REG命令对注册表进行操作

    :: 首先执行备份至临时目录
    ECHO.
    ECHO ■■■■ 备份注册表 ■■■■
    ECHO ┌────────────┐

    ECHO 备份路径 - %TEMP%
    REG EXPORT HKCR\\.exe %TEMP%\\%T%_HKCR.exe.reg /y
    REG EXPORT HKCR\\.lnk %TEMP%\\%T%_HKCR.lnk.reg /y
    REG EXPORT HKCR\\exefile %TEMP%\\%T%_HKCR.exefile.reg /y
    REG EXPORT HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk %TEMP%\\%T%_HKCU.lnk.reg /y
    REG EXPORT HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe %TEMP%\\%T%_HKCU.exe.reg /y

    ECHO └────────────┘
    ECHO ☆☆注册表备份完毕☆☆
    ECHO.
    ECHO ■■■■ 修复注册表 ■■■■
    ECHO ┌────────────┐

    :: HKEY_CLASSES_ROOT\\exefile
    REG DELETE "HKEY_CLASSES_ROOT\\exefile\\DefaultIcon" /f
    REG ADD "HKEY_CLASSES_ROOT\\exefile\\DefaultIcon" /ve /t REG_SZ /d "%%1" /f

    :: 设置变量并赋值
    set exe=""""%%1""" %%*"
    REG DELETE "HKEY_CLASSES_ROOT\\exefile\\shell\\open" /f
    REG DELETE "HKEY_CLASSES_ROOT\\exefile\\shell\\runas" /f
    REG ADD "HKEY_CLASSES_ROOT\\exefile\\shell\\open\\command" /ve /t REG_SZ /d %exe% /f
    REG ADD "HKEY_CLASSES_ROOT\\exefile\\shell\\open\\command" /v "IsolatedCommand" /t REG_SZ /d %exe% /f
    REG ADD "HKEY_CLASSES_ROOT\\exefile\\shell\\runas\\command" /ve /t REG_SZ /d %exe% /f
    REG ADD "HKEY_CLASSES_ROOT\\exefile\\shell\\runas\\command" /v "IsolatedCommand" /t REG_SZ /d %exe% /f

    :: HKEY_CLASSES_ROOT\\.exe
    REG ADD "HKEY_CLASSES_ROOT\\.exe" /ve /t REG_SZ /d "exefile" /f
    assoc.exe=exefile

    :: HKEY_CLASSES_ROOT\\.lnk
    REG ADD "HKEY_CLASSES_ROOT\\.lnk" /ve /t REG_SZ /d lnkfile /f
    assoc.lnk=lnkfile

    :: HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\UserChoice" /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk" /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\OpenWithProgids" /ve /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\Openwithlist" /ve /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\OpenWithProgids" /va /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.lnk\\Openwithlist" /va /f

    :: HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\UserChoice" /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe" /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\OpenWithProgids" /ve /f
    REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\Openwithlist" /ve /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\OpenWithProgids" /va /f
    REG DELETE "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.exe\\Openwithlist" /va /f

    :: REG DELETE "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ShellIcons" /f

    :: 判断图标缓存文件 IconCache.db 是否存在 ,是则删除文件
    :: 针对 Win7 等系统
    IF EXIST "%USERPROFILE%\\AppData\\Local\\IconCache.db" (DEL /F /Q /A "%USERPROFILE%\\AppData\\Local\\IconCache.db") ELSE (ECHO 未发现图标缓存文件)

    :: 重启 explorer 进程
    :: 强制结束 资源管理器 explorer 进程
    TASKKILL /IM explorer.exe /F
    :: 延迟操作
    ECHO 3 秒后自动启动 explorer 进程
    TIMEOUT 3
    :: 启动 资源管理器 explorer 进程
    start "" "explorer.exe"

    ECHO └────────────┘
    ECHO ☆☆注册表修复完成☆☆
    ECHO.
    :: 等待按键继续
    ECHO .......................................................................
    echo 操作完毕,请查看是否已经修复.
    echo.
    echo 提示:如果存在系统托盘图标部分消失的问题,请打开任务管理器 结束 explorer 进程,新建 explorer 进程即可,或者重启电脑。
    pause>nul

    REM =====END=====