C程序注册激活代码

上传人:沈*** 文档编号:123917215 上传时间:2022-07-23 格式:DOC 页数:19 大小:121KB
收藏 版权申诉 举报 下载
C程序注册激活代码_第1页
第1页 / 共19页
C程序注册激活代码_第2页
第2页 / 共19页
C程序注册激活代码_第3页
第3页 / 共19页
资源描述:

《C程序注册激活代码》由会员分享,可在线阅读,更多相关《C程序注册激活代码(19页珍藏版)》请在装配图网上搜索。

1、实例说明为了使软件能被更广泛的推广,开发商希望能有更多的用户使用软件,但他们又不想让用户长时间免费使用未经授权的软件,这时就可以推出试用版软件,限制用户的使用次数,当用户感觉使用方便的话,可以花钱获取注册码,以获取其正式版软件。本实例使用C#实现了限制软件使用次数功能,运行本实例,如果程序未注册,那么提示用户已经使用过几次,如图1所示,然后进入程序主窗体,单击主窗体中的“注册按钮,弹出如图2所示的软件注册窗体,该窗体中自动获取机器码,用户输入正确的注册码之后,单击“注册按钮,即可成功注册程序,注册之后的程序将不再提示软件试用次数。图1 使用次数提示 图2 软件注册注册码可由光盘中程序文件夹下提

2、供的注册机程序得到。设计思路 限制软件的使用次数时,首先需要判断软件是否已经注册,如果已经注册,那么用户可以任意使用软件。如果软件未注册,那么判断软件是否初次使用,如果是初次使用,那么在系统注册表中新建一个子项,用来存储软件的使用次数,并且设置初始值为1;如果不是初次使用,那么从存储软件使用次数的注册表项中获取已经使用的次数,然后将获取的使用次数加一,作为新的软件使用次数,存储到注册表中。技术要点 本实例获取软件使用次数时用到Registry类的GetValue方法,向注册表中写入软件使用次数时用到Registry类的SetValue方法。另外,在对软件进行注册时,需要根据硬盘序列号和CPU序

3、列号生成机器码和注册码,此时用到WMI管理对象中的ManagementClass类、ManagementObject类和ManagementObjectCollection类,下面对本实例中用到的关键技术进行详细讲解。1Registry类的GetValue方法Registry类提供表示Windows注册表中的根项的RegistryKey对象,并提供访问项/值对的静态方法,其GetValue方法用来检索与指定的注册表项中的指定名称关联的值,如果在指定的项中未找到该名称,那么返回提供的默认值;如果指定的项不存在,那么返回null。GetValue方法语法格式如下:public static Obj

4、ect GetValue(string keyName,string valueName,Object defaultValue)? keyName:以有效注册表根如“HKEY_CURRENT_USER开头键的完整注册表路径。? valueName:名称/值对的名称。? defaultValue:当name不存在时返回的值。? 返回值:如果由keyName指定的子项不存在,那么返回null;否那么,返回与valueName关联的值;或者,如果未找到valueName,那么返回defaultValue。例如,下面代码用来获取软件的使用次数:tLong = (Int32)Registry.GetV

5、alue(HKEY_LOCAL_MACHINE/SOFTWARE/tryTimes, UseTimes, 0);Registry类位于Microsoft.Win32命名空间下。2Registry类的SetValue方法Registry类的SetValue方法用来设置注册表项中的名称/值对的值,该方法为可重载方法,它有两种重载形式,第一种重载形式语法格式如下:public static void SetValue(string keyName,string valueName,Object value)? keyName:以有效注册表根如“HKEY_CURRENT_USER开头键的完整注册表路径

6、。? valueName:名称/值对的名称。? value:要存储的值。第二种重载形式语法格式如下:public static void SetValue(string keyName,string valueName,Object value,RegistryValueKind valueKind)? keyName:以有效注册表根如“HKEY_CURRENT_USER开头键的完整注册表路径。? valueName:名称/值对的名称。? value:要存储的值。? valueKind:存储数据时使用的注册表数据类型。例如,本实例中将软件使用次数写入注册表的实现代码如下:if (tLong 3

7、0)int Times = tLong + 1;Registry.SetValue(HKEY_LOCAL_MACHINE/SOFTWARE/tryTimes, UseTimes, Times);3ManagementClass类ManagementClass类表示公共信息模型CIM管理类。管理类是一个WMI类,如Win32_LogicalDisk类和Win32_Process类,前者表示磁盘驱动器,后者表示进程如Notepad.exe。通过该类的成员,可以使用特定的WMI类路径访问WMI数据。例如,本实例中使用ManagementClass类对本地进程信息进行访问,代码如下:Managemen

8、tClass myCpu = new ManagementClass(win32_Processor);4ManagementObject类ManagementObject类表示WMI实例,本实例中用到该类的Get方法、GetPropertyValue方法和Properties属性,其中Get方法用来将WMI类信息绑定到管理对象,其语法格式如下:public void Get()GetPropertyValue方法用来获取某属性值的等效访问器,其语法格式如下:public Object GetPropertyValue(string propertyName)? propertyName:相关

9、的属性的名称。? 返回值:指定的属性的值。例如,本实例中获取硬盘序列号的代码如下:ManagementObject disk = new ManagementObject(win32_logicaldisk.deviceid=d:);disk.Get();return disk.GetPropertyValue(VolumeSerialNumber).ToString();Properties属性用来获取描述管理对象属性的PropertyData对象的集合,其语法格式如下:public virtual PropertyDataCollection Properties get; ? 属性值:返

10、回一个PropertyDataCollection,它包含管理对象的属性。例如,本实例中获取CPU序列号的代码如下:foreach (ManagementObject myObject in myCpuConnection)strCpu = myObject.PropertiesProcessorid.Value.ToString();break;5ManagementObjectCollection类ManagementObjectCollection类表示通过WMI检索到的管理对象的不同集合,此集合中的对象为从ManagementBaseObject派生的类型,包括ManagementOb

11、ject和ManagementClass。例如,本实例中通过使用ManagementClass对象的GetInstances方法获取管理对象集合,代码如下:ManagementObjectCollection myCpuConnection = myCpu.GetInstances();ManagementClass类、ManagementObject类和ManagementObjectCollection类都位于System.Management命名空间下,添加该命名空间时,首先需要在“添加引用中添加System.Management.dll组件。实现过程 1新建一个Windows应用程序,

12、将其命名为LimitSoftUseTimes,将其默认窗体重命名为frmMain。2在 LimitSoftUseTimes工程中添加一个Windows窗体,命名为frmRegister,用来实现软件注册功能。frmRegister窗体主要用到的控件及说明如表1所示。表1 frmRegister窗体主要用到的控件及说明3主要程序代码。frmMain窗体加载时,首先判断程序是否注册,如果已经注册,那么将主窗体Text属性设置为“主窗体已注册,否那么,将主窗体Text属性设置为“主窗体未注册,并且提示软件为试用版和已经使用的次数,同时将注册表中记录的软件使用次数加一。frmMain窗体的Load事件

13、代码如下:private void frmMain_Load(object sender, EventArgs e)RegistryKey retkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(software, true).CreateSubKey(mrwxk).CreateSubKey(mrwxk.ini); /翻开注册表项foreach (string strRNum in retkey.GetSubKeyNames() /判断是否注册if (strRNum = softreg.getRNum() /判断注册码是否相同this

14、.Text = 主窗体已注册;button1.Enabled = false;return;this.Text = 主窗体未注册;button1.Enabled = true;MessageBox.Show(您现在使用的是试用版,该软件可以免费试用30次!, 提示, MessageBoxButtons.OK, MessageBoxIcon.Information);Int32 tLong;try/获取软件的已经使用次数tLong = (Int32)Registry.GetValue(HKEY_LOCAL_MACHINE/SOFTWARE/tryTimes, UseTimes, 0);Messa

15、geBox.Show(感谢您已使用了 + tLong + 次, 提示, MessageBoxButtons.OK, MessageBoxIcon.Information);catch/首次使用软件Registry.SetValue(HKEY_LOCAL_MACHINE/SOFTWARE/tryTimes, UseTimes, 0, RegistryValueKind.DWord);MessageBox.Show(欢送新用户使用本软件, 提示, MessageBoxButtons.OK, MessageBoxIcon.Information);/获取软件已经使用次数tLong = (Int32)

16、Registry.GetValue(HKEY_LOCAL_MACHINE/SOFTWARE/tryTimes, UseTimes, 0);if (tLong 30)int Times = tLong + 1; /计算软件本次是第几次使用/将软件使用次数写入注册表Registry.SetValue(HKEY_LOCAL_MACHINE/SOFTWARE/tryTimes, UseTimes, Times);elseMessageBox.Show(试用次数已到, 警告, MessageBoxButtons.OK, MessageBoxIcon.Warning);Application.Exit()

17、; /退出应用程序上面的代码中用到getRNum方法,该方法用来根据指定的机器码生成注册码,实现代码如下:/生成注册码public string getRNum()setIntCode(); /初始化127位数组for (int i = 1; i Charcode.Length; i+) /把机器码存入数组中Charcodei = Convert.ToChar(this.getMNum().Substring(i - 1, 1);for (int j = 1; j intNumber.Length; j+) /把字符的ASCII值存入一个整数组中。intNumberj = intCodeCon

18、vert.ToInt32(Charcodej) + Convert.ToInt32(Charcodej);string strAsciiName = ; /用于存储注册码for (int j = 1; j = 48 & intNumberj = 65 & intNumberj = 97 & intNumberj 122) /判断字符ASCII值是否大于zstrAsciiName += Convert.ToChar(intNumberj - 10).ToString();elsestrAsciiName += Convert.ToChar(intNumberj - 9).ToString();r

19、eturn strAsciiName; /返回生成的注册码在frmMain窗体中单击“注册按钮时,弹出“软件注册窗体,该窗体加载时自动获得本机机器码,实现代码如下:private void frmRegister_Load(object sender, EventArgs e)textBox1.Text = softreg.getMNum();上面的代码中用到getMNum方法,该方法为自定义的返回值类型为string类型的方法,它主要用来根据本机的CPU和硬盘序列号生本钱机机器码。getMNum方法实现代码如下:/生成机器码public string getMNum()string strN

20、um = getCpu() + GetDiskVolumeSerialNumber(); /获得24位Cpu和硬盘序列号string strMNum = strNum.Substring(0, 24); /从生成的字符串中取出前24个字符做为机器码return strMNum; /返回生成的机器码getMNum方法中用到getCpu和GetDiskVolumeSerialNumber两个自定义方法,其中getCpu方法用来获取本机CPU序列号,GetDiskVolumeSerialNumber方法用来获取本机硬盘序列号,它们的实现代码如下:/获得CPU的序列号public string get

21、Cpu()string strCpu = null;ManagementClass myCpu = new ManagementClass(win32_Processor); /获取系统CPU处理器ManagementObjectCollection myCpuConnection = myCpu.GetInstances();foreach (ManagementObject myObject in myCpuConnection)strCpu = myObject.PropertiesProcessorid.Value.ToString(); /获取CPU序列号break;return s

22、trCpu;/ 取得设备硬盘的序列号public string GetDiskVolumeSerialNumber()/获取系统硬盘ManagementClass mc = new ManagementClass(Win32_NetworkAdapterConfiguration);ManagementObject disk = new ManagementObject(win32_logicaldisk.deviceid=d:);disk.Get();return disk.GetPropertyValue(VolumeSerialNumber).ToString(); /返回硬盘序列号fr

23、mRegister窗体中单击“注册按钮时,程序首先判断是否输入注册码,如果没有,弹出信息提示,否那么判断用户输入的注册码与本机应该生成的注册码是否相同,如果相同,那么注册成功,并将软件注册信息写入到注册表中。“注册按钮的Click事件代码如下:private void button1_Click(object sender, EventArgs e)if (textBox2.Text = ) /判断是否输入了注册码MessageBox.Show(注册码输入不能为空!, 警告, MessageBoxButtons.OK, MessageBoxIcon.Warning);elseif (textB

24、ox2.Text.Equals(softreg.getRNum() /判断注册码是否正确RegistryKey retkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(software, true).CreateSubKey(mrwxk).CreateSubKey(mrwxk.ini).CreateSubKey(textBox2.Text); /翻开注册表项,并创立一个子项retkey.SetValue(UserName, mrsoft); /为新创立的注册表项设置值MessageBox.Show(注册成功,程序需要重新加载!, 提示

25、, MessageBoxButtons.OK, MessageBoxIcon.Information);this.Hide(); /隐藏当前窗体frmMain frmmain = new frmMain() /实例化主窗体对象;frmmain.Show(); /显示主窗体elseMessageBox.Show(注册码输入错误!, 错误, MessageBoxButtons.OK, MessageBoxIcon.Error);-代码例如:注册类:using System;using System.Collections.Generic;using System.Text;using System

26、.Management;namespace SoftRegister public class SoftReg / / 获取硬盘卷标号 / / private string GetDiskVolumeSerialNumber() ManagementClass mc = new ManagementClass(win32_NetworkAdapterConfiguration); ManagementObject disk = new ManagementObject(win32_logicaldisk.deviceid=c:); disk.Get(); return disk.GetProp

27、ertyValue(VolumeSerialNumber).ToString(); / / 获取CPU序列号 / / private string GetCpu() string strCpu = null; ManagementClass myCpu = new ManagementClass(win32_Processor); ManagementObjectCollection myCpuCollection = myCpu.GetInstances(); foreach (ManagementObject myObject in myCpuCollection) strCpu = my

28、Object.PropertiesProcessorid.Value.ToString(); return strCpu; / / 生成机器码 / / public string GetMNum() string strNum = GetCpu() + GetDiskVolumeSerialNumber(); string strMNum = strNum.Substring(0, 24); /截取前24位作为机器码 return strMNum; private int intCode = new int127; /存储密钥 private char charCode = new char2

29、5; /存储ASCII码 private int intNumber = new int25; /存储ASCII码值 /初始化密钥 private void SetIntCode() for (int i = 1; i intCode.Length; i+) intCodei = i % 9; / / 生成注册码 / / private string GetRNum(string strMNum) SetIntCode(); for (int i = 1; i charCode.Length; i+) /存储机器码 charCodei = Convert.ToChar(strMNum.Subs

30、tring(i - 1, 1); for (int j = 1; j intNumber.Length; j+) /改变ASCII码值 intNumberj = Convert.ToInt32(charCodej) + intCodeConvert.ToInt32(charCodej); string strAsciiName = ; /注册码 for (int k = 1; k = 48 & intNumberk = 65 & intNumberk = 97 & intNumberk 122) /判断如果大于z strAsciiName += Convert.ToChar(intNumber

31、k - 10).ToString(); else strAsciiName += Convert.ToChar(intNumberk - 9).ToString(); return strAsciiName; / / 注册是否通过 / / / public bool IsReg(string regstr) string reg = GetRNum(GetMNum(); if (reg = regstr) return true; else return false; 注册验证 private bool GetReg() /判断软件是否注册 RegistryKey retkey = Regis

32、try.CurrentUser.OpenSubKey(SOFTWARE, true).CreateSubKey(wxf).CreateSubKey(wxf.INI); foreach (string strRNum in retkey.GetSubKeyNames() if (softReg.IsReg(strRNum) return true; return false; 注册机 private int intCode = new int127; /存储密钥 private char charCode = new char25; /存储ASCII码 private int intNumber

33、 = new int25; /存储ASCII码值 private void button1_Click(object sender, EventArgs e) string code = this.textBox1.Text; string keys = GetRNum(code); this.textBox2.Text = keys; /初始化密钥 private void SetIntCode() for (int i = 1; i intCode.Length; i+) intCodei = i % 9; private void button2_Click(object sender,

34、 EventArgs e) Application.Exit(); / / 生成注册码 / / private string GetRNum(string strMNum) SetIntCode(); for (int i = 1; i charCode.Length; i+) /存储机器码 charCodei = Convert.ToChar(strMNum.Substring(i - 1, 1); for (int j = 1; j intNumber.Length; j+) /改变ASCII码值 intNumberj = Convert.ToInt32(charCodej) + intC

35、odeConvert.ToInt32(charCodej); string strAsciiName = ; /注册码 for (int k = 1; k = 48 & intNumberk = 65 & intNumberk = 97 & intNumberk 122) /判断如果大于z strAsciiName += Convert.ToChar(intNumberk - 10).ToString(); else strAsciiName += Convert.ToChar(intNumberk - 9).ToString(); return strAsciiName; C#WinForm

36、实现软件注册SoftReg类:View Code 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Management; 6 7 namespace SoftRegister 8 9 class SoftReg 10 11 / 12 / 获取硬盘卷标号 13 / 14 / 15 public string GetDiskVolumeSerialNumber() 16 17 ManagementClass mc = new Ma

37、nagementClass(win32_NetworkAdapterConfiguration); 18 ManagementObject disk = new ManagementObject(win32_logicaldisk.deviceid=c:); 19 disk.Get(); 20 return disk.GetPropertyValue(VolumeSerialNumber).ToString(); 21 22 23 / 24 / 获取CPU序列号 25 / 26 / 27 public string GetCpu() 28 29 string strCpu = null; 30

38、 ManagementClass myCpu = new ManagementClass(win32_Processor); 31 ManagementObjectCollection myCpuCollection = myCpu.GetInstances(); 32 foreach (ManagementObject myObject in myCpuCollection) 33 34 strCpu = myObject.PropertiesProcessorid.Value.ToString(); 35 36 return strCpu; 37 38 39 / 40 / 生成机器码 41

39、 / 42 / 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 int127; /存储密钥 51 public char charCode = new char25; /存储ASCII码 52 public int intNumber = new int

40、25; /存储ASCII码值 53 54 /初始化密钥 55 public void SetIntCode() 56 57 for (int i = 1; i intCode.Length; i+) 58 59 intCodei = i % 9; 60 61 63 / 64 / 生成注册码 65 / 66 / 67 public string GetRNum() 68 69 SetIntCode(); 70 string strMNum = GetMNum(); 71 for (int i = 1; i charCode.Length; i+) /存储机器码 72 73 charCodei =

41、Convert.ToChar(strMNum.Substring(i - 1, 1); 74 75 for (int j = 1; j intNumber.Length; j+) /改变ASCII码值 76 77 intNumberj = Convert.ToInt32(charCodej) + intCodeConvert.ToInt32(charCodej); 78 79 string strAsciiName = ; /注册码 80 for (int k = 1; k = 48 & intNumberk = 65 & intNumberk 84 = 97 & intNumberk 122

42、) /判断如果大于z 89 90 strAsciiName += Convert.ToChar(intNumberk - 10).ToString(); 91 92 else 93 94 strAsciiName+=Convert.ToChar(intNumberk-9).ToString(); 95 96 97 return strAsciiName; 98 99 100 注册窗体:View Code 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using Syste

43、m.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 SoftRegister12 13 public partial class frmRegisterForm : Form14 15 public frmRegisterForm()16 17 InitializeComponent();18 19 public static bool state = true

44、; /软件是否为可用状态20 SoftReg softReg = new SoftReg();21 private void btnClose_Click(object sender, EventArgs e)22 23 if (state = true)24 25 this.Close();26 27 else 28 29 Application.Exit();30 31 32 33 private void btnReg_Click(object sender, EventArgs e)34 35 try36 37 if (txtRNum.Text = softReg.GetRNum()38 39 MessageBox.Show(注册成功!重启软件后生效!, 信息, MessageBoxButtons.OK, MessageBoxIcon.Information);40 RegistryKey retkey = Registry.CurrentUser.OpenSubKey(Software, true).CreateSubKey(wxf).CreateSubKey(wxf.INI).CreateSubKey(txtRNum.Text);41 retkey.SetValue(UserName, Rsoft);42 this.Close();43 44 else45

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!