服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C# WinForm 登录界面的图片验证码(区分大小写+不区分大小写)

C# WinForm 登录界面的图片验证码(区分大小写+不区分大小写)

2022-08-27 15:48人生、蜕变 C#

这篇文章主要介绍了C# WinForm 登录界面的图片验证码(区分大小写+不区分大小写),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、功能界面

 

C# WinForm 登录界面的图片验证码(区分大小写+不区分大小写)

 

图1 验证码(区分大小写)

C# WinForm 登录界面的图片验证码(区分大小写+不区分大小写)

 

图2 验证码(不区分大小写)

 

二、创建一个产生验证码的类Class1

(1)生成随机验证码字符串,用的是Random随机函数
(2)创建验证码图片,将该字符串画在PictureBox控件中

Class1.cs:

?
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;//图片
using System.Windows.Forms;
 
namespace ValidCodeTest
{
  public class Class1
  {
    #region 验证码功能     
    /// <summary>
    /// 生成随机验证码字符串
    /// </summary>
    public static string CreateRandomCode(int CodeLength)
    {
      int rand;
      char code;
      string randomCode = String.Empty;//随机验证码
        
        //生成一定长度的随机验证码   
      //Random random = new Random();//生成随机数对象
      for (int i = 0; i < CodeLength; i++)
      {
        //利用GUID生成6位随机数  
        byte[] buffer = Guid.NewGuid().ToByteArray();//生成字节数组
        int seed = BitConverter.ToInt32(buffer, 0);//利用BitConvert方法把字节数组转换为整数
        Random random = new Random(seed);//以生成的整数作为随机种子
        rand = random.Next();
 
        //rand = random.Next();  
        if (rand % 3 == 1)
        {
          code = (char)('A' + (char)(rand % 26));
        }
        else if (rand % 3 == 2)
        {
          code = (char)('a' + (char)(rand % 26));         
        }
        else
        {
          code = (char)('0' + (char)(rand % 10));
        }
        randomCode += code.ToString();
      }
      return randomCode;
    }
 
    /// <summary>
    /// 创建验证码图片
    /// </summary>
    public static void CreateImage(string strValidCode, PictureBox pbox)
    {
      try
      {
        int RandAngle = 45;//随机转动角度
        int MapWidth = (int)(strValidCode.Length * 21);
        Bitmap map = new Bitmap(MapWidth, 28);//验证码图片—长和宽
 
                //创建绘图对象Graphics
        Graphics graph = Graphics.FromImage(map);
        graph.Clear(Color.AliceBlue);//清除绘画面,填充背景色
        graph.DrawRectangle(new Pen(Color.Black, 0), 0, 0, map.Width - 1, map.Height - 1);//画一个边框
        graph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;//模式
        Random rand = new Random();
        //背景噪点生成
        Pen blackPen = new Pen(Color.LightGray, 0);
        for (int i = 0; i < 50; i++)
        {
          int x = rand.Next(0, map.Width);
          int y = rand.Next(0, map.Height);
          graph.DrawRectangle(blackPen, x, y, 1, 1);
        }
        //验证码旋转,防止机器识别
        char[] chars = strValidCode.ToCharArray();//拆散字符串成单字符数组
        //文字居中
        StringFormat format = new StringFormat(StringFormatFlags.NoClip);
        format.Alignment = StringAlignment.Center;
        format.LineAlignment = StringAlignment.Center;
        //定义颜色
        Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
        //定义字体
        string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
        for (int i = 0; i < chars.Length; i++)
        {
          int cindex = rand.Next(7);
          int findex = rand.Next(5);
          Font f = new System.Drawing.Font(font[findex], 13, System.Drawing.FontStyle.Bold);//字体样式(参数2为字体大小)
          Brush b = new System.Drawing.SolidBrush(c[cindex]);
          Point dot = new Point(16, 16);
 
          float angle = rand.Next(-RandAngle, RandAngle);//转动的度数
          graph.TranslateTransform(dot.X, dot.Y);//移动光标到指定位置
          graph.RotateTransform(angle);
          graph.DrawString(chars[i].ToString(), f, b, 1, 1, format);
 
          graph.RotateTransform(-angle);//转回去
          graph.TranslateTransform(2, -dot.Y);//移动光标到指定位置
        }
        pbox.Image = map;
      }
      catch (ArgumentException)
      {
        MessageBox.Show("验证码图片创建错误");
      }
    }
    #endregion
  }
}

三、调用

(1)更新验证码
(2)验证(区分大小写)
(3)验证(不区分大小写)

Form1.cs:

?
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ValidCodeTest;
 
namespace ValidCode
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }
 
 
    #region 验证码
    private const int ValidCodeLength = 4;//验证码长度   
    private String strValidCode = "";//验证码           
 
    //调用自定义函数,更新验证码
    private void UpdateValidCode()
    {
      strValidCode = Class1.CreateRandomCode(ValidCodeLength);//生成随机验证码
      if (strValidCode == "") return;
      Class1.CreateImage(strValidCode, pbox1);//创建验证码图片
    }
    #endregion
 
 
    private void pbox1_Click(object sender, EventArgs e)
    {
      UpdateValidCode();//点击更新验证码
    }
 
 
    private void Form1_Load(object sender, EventArgs e)
    {
      UpdateValidCode();//加载更新验证码
    }
 
 
    /// <summary>
    /// 验证(区分大小写)
    /// </summary>   
    private void btn1_Click(object sender, EventArgs e)
    {
      string validcode = txtValidCode.Text.Trim();
 
      char[] ch1 = validcode.ToCharArray();
      char[] ch2 = strValidCode.ToCharArray();
      int Count1 = 0;//字母个数
      int Count2 = 0;//数字个数
 
      if (String.IsNullOrEmpty(validcode) != true)//验证码不为空
      {
        for (int i = 0; i < strValidCode.Length; i++)
        {
          if ((ch1[i] >= 'a' && ch1[i] <= 'z') || (ch1[i] >= 'A' && ch1[i] <= 'Z'))//字母
          {
            if (ch1[i] == ch2[i])
            {
              Count1++;
            }
          }
          else//数字
          {
            if (ch1[i] == ch2[i])
            {
              Count2++;
            }
          }
 
        }
 
        int CountSum = Count1 + Count2;
        if (CountSum == strValidCode.Length)
        {
          MessageBox.Show("验证通过", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
          UpdateValidCode();
          txtValidCode.Text = "";
          txtValidCode.Focus();
        }
        else
        {
          MessageBox.Show("验证失败", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
          UpdateValidCode();//更新验证码
          txtValidCode.Text = "";
          txtValidCode.Focus();
        }
      }
      else//验证码为空
      {
        MessageBox.Show("请输入验证码", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        UpdateValidCode();//更新验证码
        txtValidCode.Text = "";
        txtValidCode.Focus();
      }
    }
 
 
    /// <summary>
    /// 验证(不区分大小写)
    /// </summary>
    private void btn2_Click(object sender, EventArgs e)
    {
      string validcode = txtValidCode.Text.Trim();
 
      if (String.IsNullOrEmpty(validcode) != true)//验证码不为空
      {
        if (validcode.ToLower() == strValidCode.ToLower())
        {
          MessageBox.Show("验证通过", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
          UpdateValidCode();
          txtValidCode.Text = "";
          txtValidCode.Focus();
        }
        else
        {
          MessageBox.Show("验证失败", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
          UpdateValidCode();//更新验证码
          txtValidCode.Text = "";
          txtValidCode.Focus();
        }
      }
      else//验证码为空
      {
        MessageBox.Show("请输入验证码", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        UpdateValidCode();//更新验证码
        txtValidCode.Text = "";
        txtValidCode.Focus();
      }
    }
  }
}

.exe测试文件下载: ValidCode.zip

参考文章:
https://www.jianshu.com/p/d89f22cf51bf

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/IT_xiao_guang_guang/article/details/104250015

延伸 · 阅读

精彩推荐
  • C#C#运行时相互关系浅析

    C#运行时相互关系浅析

    这篇文章介绍了C#运行时相互关系,包括运行时类型、对象、线程栈和托管堆之间的相互关系,静态方法、实例方法和虚方法的区别等等。...

    C#教程网5282021-11-01
  • C#C# Xamarin利用ZXing.Net.Mobile进行扫码的方法

    C# Xamarin利用ZXing.Net.Mobile进行扫码的方法

    这篇文章主要介绍了C# Xamarin利用ZXing.Net.Mobile进行扫码的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    kiba51811302022-07-24
  • C#UGUI绘制多点连续的平滑曲线

    UGUI绘制多点连续的平滑曲线

    这篇文章主要为大家详细介绍了UGUI绘制多点连续的平滑曲线,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    叫我上上4452022-03-07
  • C#使用C#创建Windows服务的实例代码

    使用C#创建Windows服务的实例代码

    这篇文章主要介绍了使用C#创建Windows服务的实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    cnc7902022-01-17
  • C#C# networkcomms 3.0实现模拟登陆总结

    C# networkcomms 3.0实现模拟登陆总结

    这篇文章主要介绍了C# networkcomms 3.0实现模拟登陆总结,需要的朋友可以参考下...

    蒙蒙大川9602022-01-10
  • C#C#的自定义语法糖的使用详解

    C#的自定义语法糖的使用详解

    这篇文章主要介绍了C#的自定义语法糖的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    程度飞11832022-07-21
  • C#DirectoryEntry配置IIS7出现ADSI Error:未知错误(0x80005000)

    DirectoryEntry配置IIS7出现ADSI Error:未知错误(0x80005000)

    这篇文章主要介绍了DirectoryEntry配置IIS7出现ADSI Error:未知错误(0x80005000)的解决办法...

    C#教程网12352021-10-28
  • C#C#中Winform获取文件路径的方法实例小结

    C#中Winform获取文件路径的方法实例小结

    这篇文章主要介绍了C#中Winform获取文件路径的方法,以实例形式较为详细的总结了WinForm关于路径操作的常用技巧,具有一定参考借鉴价值,需要的朋友可以参考...

    蓝图4352021-10-28