开发C#软件过程中,要用到注册机制,在网上看到韩兆新老师的一篇文章很有启发,转载分享
(一)软件的实现
SoftReg类:
1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Text; 5: using System.Management; //需要引用System.Management.dll 6: 7: namespace SoftRegister 8: { 9: class SoftReg 10: { 11: ///<summary> 12: /// 获取硬盘卷标号 13: ///</summary> 14: ///<returns></returns> 15: public string GetDiskVolumeSerialNumber() 16: { 17: ManagementClass mc = new ManagementClass("win32_NetworkAdapterConfiguration"); 18: ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\"c:\""); 19: disk.Get(); 20: return disk.GetPropertyValue("VolumeSerialNumber").ToString(); 21: } 22: 23: ///<summary> 24: /// 获取CPU序列号 25: ///</summary> 26: ///<returns></returns> 27: public string GetCpu() 28: { 29: string strCpu = null; 30: ManagementClass myCpu = new ManagementClass("win32_Processor"); 31: ManagementObjectCollection myCpuCollection = myCpu.GetInstances(); 32: foreach (ManagementObject myObject in myCpuCollection) 33: { 34: strCpu = myObject.Properties["Processorid"].Value.ToString(); 35: } 36: return strCpu; 37: } 38: 39: ///<summary> 40: /// 生成机器码 41: ///</summary> 42: ///<returns></returns> 43: public string GetMNum() 44: { 45: string strNum = GetCpu() + GetDiskVolumeSerialNumber(); 46: string strMNum = strNum.Substring(0, 24); //截取前24位作为机器码 47: return strMNum; 48: } 49: 50: public int[] intCode = new int[127]; //存储密钥 51: public char[] charCode = new char[25]; //存储ASCII码 52: public int[] intNumber = new int[25]; //存储ASCII码值 53: 54: //初始化密钥 55: public void SetIntCode() 56: { 57: for (int i = 1; i < intCode.Length; i++) 58: { 59: intCode[i] = i % 9; 60: } 61: } 62: 63: ///<summary> 64: /// 生成注册码 65: ///</summary> 66: ///<returns></returns> 67: public string GetRNum() 68: { 69: SetIntCode(); 70: string strMNum = GetMNum(); 71: for (int i = 1; i < charCode.Length; i++) //存储机器码 72: { 73: charCode[i] = Convert.ToChar(strMNum.Substring(i - 1, 1)); 74: } 75: for (int j = 1; j < intNumber.Length; j++) //改变ASCII码值 76: { 77: intNumber[j] = Convert.ToInt32(charCode[j]) + intCode[Convert.ToInt32(charCode[j])]; 78: } 79: string strAsciiName = ""; //注册码 80: for (int k = 1; k < intNumber.Length; k++) //生成注册码 81: { 82: 83: if ((intNumber[k] >= 48 && intNumber[k] <= 57) || (intNumber[k] >= 65 && intNumber[k] 84: <= 90) || (intNumber[k] >= 97 && intNumber[k] <= 122)) //判断如果在0-9、A-Z、a-z之间 85: { 86: strAsciiName += Convert.ToChar(intNumber[k]).ToString(); 87: } 88: else if (intNumber[k] > 122) //判断如果大于z 89: { 90: strAsciiName += Convert.ToChar(intNumber[k] - 10).ToString(); 91: } 92: else 93: { 94: strAsciiName += Convert.ToChar(intNumber[k] - 9).ToString(); 95: } 96: } 97: return strAsciiName; 98: } 99: } 100: }
主窗体
1: using System; 2: using System.Collections.Generic; 3: using System.ComponentModel; 4: using System.Data; 5: using System.Drawing; 6: using System.Linq; 7: using System.Text; 8: using System.Windows.Forms; 9: using Microsoft.Win32; 10: 11: namespace SoftRegister 12: { 13: public partial class FormMain : Form 14: { 15: public FormMain() 16: { 17: InitializeComponent(); 18: } 19: 20: SoftReg softReg = new SoftReg(); 21: 22: private void FormMain_Load(object sender, EventArgs e) 23: { 24: //判断软件是否注册 25: RegistryKey retkey = Registry.CurrentUser.OpenSubKey("SOFTWARE", true).CreateSubKey("mySoftWare").CreateSubKey("Register.INI"); 26: foreach (string strRNum in retkey.GetSubKeyNames()) 27: { 28: if (strRNum == softReg.GetRNum()) 29: { 30: this.labRegInfo.Text = "此软件已注册!"; 31: this.btnReg.Enabled = false; 32: return; 33: } 34: } 35: this.labRegInfo.Text = "此软件尚未注册!"; 36: this.btnReg.Enabled = true; 37: MessageBox.Show("您现在使用的是试用版,可以免费试用30次!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information); 38: 39: Int32 tLong; //已使用次数 40: try 41: { 42: tLong = (Int32)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\mySoftWare", "UseTimes", 0); 43: MessageBox.Show("您已经使用了" + tLong + "次!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information); 44: } 45: catch 46: { 47: MessageBox.Show("欢迎使用本软件!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information); 48: Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\mySoftWare", "UseTimes", 0, RegistryValueKind.DWord); 49: } 50: 51: //判断是否可以继续试用 52: tLong = (Int32)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\mySoftWare", "UseTimes", 0); 53: if (tLong < 30) 54: { 55: int tTimes = tLong + 1; 56: Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\mySoftWare", "UseTimes", tTimes); 57: } 58: else 59: { 60: DialogResult result = MessageBox.Show("试用次数已到!您是否需要注册?", "信息", MessageBoxButtons.YesNo, MessageBoxIcon.Information); 61: if (result == DialogResult.Yes) 62: { 63: FormRegister.state = false; //设置软件状态为不可用 64: btnReg_Click(sender, e); //打开注册窗口 65: } 66: else 67: { 68: Application.Exit(); 69: } 70: } 71: 72: } 73: 74: private void btnClose_Click(object sender, EventArgs e) 75: { 76: Application.Exit(); 77: } 78: 79: private void btnReg_Click(object sender, EventArgs e) 80: { 81: FormRegister frmRegister = new FormRegister(); 82: frmRegister.ShowDialog(); 83: } 84: } 85: }
注册窗体
1: using System; 2: using System.Collections.Generic; 3: using System.ComponentModel; 4: using System.Data; 5: using System.Drawing; 6: using System.Linq; 7: using System.Text; 8: using System.Windows.Forms; 9: using Microsoft.Win32; 10: 11: namespace SoftRegister 12: { 13: public partial class FormRegister : Form 14: { 15: public FormRegister() 16: { 17: InitializeComponent(); 18: } 19: 20: public static bool state = true; //软件是否为可用状态 21: SoftReg softReg = new SoftReg(); 22: 23: private void btnReg_Click(object sender, EventArgs e) 24: { 25: try 26: { 27: if (txtLicence.Text == softReg.GetRNum()) 28: { 29: MessageBox.Show("注册成功!重启软件后生效!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information); 30: RegistryKey retkey = Registry.CurrentUser.OpenSubKey("Software", true).CreateSubKey("mySoftWare").CreateSubKey("Register.INI").CreateSubKey(txtLicence.Text); 31: retkey.SetValue("UserName", "Rsoft"); 32: this.Close(); 33: } 34: else 35: { 36: MessageBox.Show("注册码错误!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); 37: txtLicence.SelectAll(); 38: } 39: } 40: catch (Exception ex) 41: { 42: throw new Exception(ex.Message); 43: } 44: } 45: 46: private void btnClose_Click(object sender, EventArgs e) 47: { 48: if (state == true) 49: { 50: this.Close(); 51: } 52: else 53: { 54: Application.Exit(); 55: } 56: } 57: 58: private void FormRegister_Load(object sender, EventArgs e) 59: { 60: this.txtHardware.Text = softReg.GetMNum(); 61: } 62: } 63: }
(二)注册机的实现
SoftReg类
1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Text; 5: using System.Management; 6: 7: namespace SoftwarePassport 8: { 9: class SoftReg 10: { 11: public int[] intCode = new int[127]; //存储密钥 12: public char[] charCode = new char[25]; //存储ASCII码 13: public int[] intNumber = new int[25]; //存储ASCII码值 14: 15: //初始化密钥 16: public void SetIntCode() 17: { 18: for (int i = 1; i < intCode.Length; i++) 19: { 20: intCode[i] = i % 9; 21: } 22: } 23: 24: ///<summary> 25: /// 生成注册码 26: ///</summary> 27: ///<returns></returns> 28: public string GetRNum(string strMNum) 29: { 30: SetIntCode(); 31: 32: for (int i = 1; i < charCode.Length; i++) //存储机器码 33: { 34: charCode[i] = Convert.ToChar(strMNum.Substring(i - 1, 1)); 35: } 36: for (int j = 1; j < intNumber.Length; j++) //改变ASCII码值 37: { 38: intNumber[j] = Convert.ToInt32(charCode[j]) + intCode[Convert.ToInt32(charCode[j])]; 39: } 40: string strAsciiName = ""; //注册码 41: for (int k = 1; k < intNumber.Length; k++) //生成注册码 42: { 43: 44: if ((intNumber[k] >= 48 && intNumber[k] <= 57) || (intNumber[k] >= 65 && intNumber[k] 45: <= 90) || (intNumber[k] >= 97 && intNumber[k] <= 122)) //判断如果在0-9、A-Z、a-z之间 46: { 47: strAsciiName += Convert.ToChar(intNumber[k]).ToString(); 48: } 49: else if (intNumber[k] > 122) //判断如果大于z 50: { 51: strAsciiName += Convert.ToChar(intNumber[k] - 10).ToString(); 52: } 53: else 54: { 55: strAsciiName += Convert.ToChar(intNumber[k] - 9).ToString(); 56: } 57: } 58: return strAsciiName; 59: } 60: } 61: }
主窗体
1: using System; 2: using System.Collections.Generic; 3: using System.ComponentModel; 4: using System.Data; 5: using System.Drawing; 6: using System.Linq; 7: using System.Text; 8: using System.Windows.Forms; 9: 10: namespace SoftwarePassport 11: { 12: public partial class FormMain : Form 13: { 14: public FormMain() 15: { 16: InitializeComponent(); 17: } 18: 19: SoftReg softReg = new SoftReg(); 20: 21: private void btnCreate_Click(object sender, EventArgs e) 22: { 23: try 24: { 25: string strHardware = this.txtHardware.Text; 26: string strLicence = softReg.GetRNum(strHardware); 27: this.txtLicence.Text = strLicence; 28: } 29: catch (System.Exception ex) 30: { 31: MessageBox.Show("输入的机器码格式错误!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); 32: } 33: } 34: 35: private void btnExit_Click(object sender, EventArgs e) 36: { 37: Application.Exit(); 38: } 39: } 40: }
原文作者:韩兆新