




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、實例說明為了使軟件能被更廣泛的推廣,開發(fā)商希望能有更多的用戶使用軟件,但他們又不想讓用戶長時間免費使用未經授權的軟件,這時就可以推出試用版軟件,限制用戶的使用次數,當用戶感覺使用方便的話,可以花錢獲取注冊碼,以獲取其正式版軟件。本實例使用C#實現了限制軟件使用次數功能,運行本實例,如果程序未注冊,則提示用戶已經使用過幾次,如圖1所示,然后進入程序主窗體,單擊主窗體中的“注冊”按鈕,彈出如圖2所示的軟件注冊窗體,該窗體中自動獲取機器碼,用戶輸入正確的注冊碼之后,單擊“注冊”按鈕,即可成功注冊程序,注冊之后的程序將不再提示軟件試用次數。圖1 使用次數提示 圖2 軟件注冊注冊碼可由光盤中程序文件夾下
2、提供的注冊機程序得到。設計思路 限制軟件的使用次數時,首先需要判斷軟件是否已經注冊,如果已經注冊,則用戶可以任意使用軟件。如果軟件未注冊,則判斷軟件是否初次使用,如果是初次使用,則在系統(tǒng)注冊表中新建一個子項,用來存儲軟件的使用次數,并且設置初始值為1;如果不是初次使用,則從存儲軟件使用次數的注冊表項中獲取已經使用的次數,然后將獲取的使用次數加一,作為新的軟件使用次數,存儲到注冊表中。技術要點 本實例獲取軟件使用次數時用到Registry類的GetValue方法,向注冊表中寫入軟件使用次數時用到Registry類的SetValue方法。另外,在對軟件進行注冊時,需要根據硬盤序列號和CPU序列號生
3、成機器碼和注冊碼,此時用到WMI管理對象中的ManagementClass類、ManagementObject類和ManagementObjectCollection類,下面對本實例中用到的關鍵技術進行詳細講解。(1)Registry類的GetValue方法Registry類提供表示Windows注冊表中的根項的RegistryKey對象,并提供訪問項/值對的靜態(tài)方法,其GetValue方法用來檢索與指定的注冊表項中的指定名稱關聯(lián)的值,如果在指定的項中未找到該名稱,則返回提供的默認值;如果指定的項不存在,則返回null。GetValue方法語法格式如下:public static Object
4、 GetValue(string keyName,string valueName,Object defaultValue)? keyName:以有效注冊表根(如“HKEY_CURRENT_USER”)開頭鍵的完整注冊表路徑。? valueName:名稱/值對的名稱。? defaultValue:當name不存在時返回的值。? 返回值:如果由keyName指定的子項不存在,則返回null;否則,返回與valueName關聯(lián)的值;或者,如果未找到valueName,則返回defaultValue。例如,下面代碼用來獲取軟件的使用次數:tLong = (Int32)Registry.GetValu
5、e("HKEY_LOCAL_MACHINE/SOFTWARE/tryTimes", "UseTimes", 0);Registry類位于Microsoft.Win32命名空間下。(2)Registry類的SetValue方法Registry類的SetValue方法用來設置注冊表項中的名稱/值對的值,該方法為可重載方法,它有兩種重載形式,第一種重載形式語法格式如下:public static void SetValue(string keyName,string valueName,Object value)? keyName:以有效注冊表根(如“HKEY
6、_CURRENT_USER”)開頭鍵的完整注冊表路徑。? valueName:名稱/值對的名稱。? value:要存儲的值。第二種重載形式語法格式如下:public static void SetValue(string keyName,string valueName,Object value,RegistryValueKind valueKind)? keyName:以有效注冊表根(如“HKEY_CURRENT_USER”)開頭鍵的完整注冊表路徑。? valueName:名稱/值對的名稱。? value:要存儲的值。? valueKind:存儲數據時使用的注冊表數據類型。例如,本實例中將軟
7、件使用次數寫入注冊表的實現代碼如下:if (tLong < 30)int Times = tLong + 1;Registry.SetValue("HKEY_LOCAL_MACHINE/SOFTWARE/tryTimes", "UseTimes", Times);(3)ManagementClass類ManagementClass類表示公共信息模型(CIM)管理類。管理類是一個WMI類,如Win32_LogicalDisk類和Win32_Process類,前者表示磁盤驅動器,后者表示進程(如Notepad.exe)。通過該類的成員,可以使用特定的W
8、MI類路徑訪問WMI數據。例如,本實例中使用ManagementClass類對本地進程信息進行訪問,代碼如下:ManagementClass myCpu = new ManagementClass("win32_Processor");(4)ManagementObject類ManagementObject類表示WMI實例,本實例中用到該類的Get方法、GetPropertyValue方法和Properties屬性,其中Get方法用來將WMI類信息綁定到管理對象,其語法格式如下:public void Get()GetPropertyValue方法用來獲取某屬性值的等效訪問
9、器,其語法格式如下:public Object GetPropertyValue(string propertyName)? propertyName:相關的屬性的名稱。? 返回值:指定的屬性的值。例如,本實例中獲取硬盤序列號的代碼如下:ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid="d:"");disk.Get();return disk.GetPropertyValue("VolumeSerialNumber").ToString(
10、);Properties屬性用來獲取描述管理對象屬性的PropertyData對象的集合,其語法格式如下:public virtual PropertyDataCollection Properties get; ? 屬性值:返回一個PropertyDataCollection,它包含管理對象的屬性。例如,本實例中獲取CPU序列號的代碼如下:foreach (ManagementObject myObject in myCpuConnection)strCpu = myObject.Properties"Processorid".Value.ToString();break
11、;(5)ManagementObjectCollection類ManagementObjectCollection類表示通過WMI檢索到的管理對象的不同集合,此集合中的對象為從ManagementBaseObject派生的類型,包括ManagementObject和ManagementClass。例如,本實例中通過使用ManagementClass對象的GetInstances方法獲取管理對象集合,代碼如下:ManagementObjectCollection myCpuConnection = myCpu.GetInstances();ManagementClass類、ManagementO
12、bject類和ManagementObjectCollection類都位于System.Management命名空間下,添加該命名空間時,首先需要在“添加引用”中添加System.Management.dll組件。實現過程 (1)新建一個Windows應用程序,將其命名為LimitSoftUseTimes,將其默認窗體重命名為frmMain。(2)在 LimitSoftUseTimes項目中添加一個Windows窗體,命名為frmRegister,用來實現軟件注冊功能。frmRegister窗體主要用到的控件及說明如表1所示。表1 frmRegister窗體主要用到的控件及說明(3)主要程序代
13、碼。frmMain窗體加載時,首先判斷程序是否注冊,如果已經注冊,則將主窗體Text屬性設置為“主窗體(已注冊)”,否則,將主窗體Text屬性設置為“主窗體(未注冊)”,并且提示軟件為試用版和已經使用的次數,同時將注冊表中記錄的軟件使用次數加一。frmMain窗體的Load事件代碼如下:private void frmMain_Load(object sender, EventArgs e)RegistryKey retkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("software", true).Creat
14、eSubKey("mrwxk").CreateSubKey("mrwxk.ini"); /打開注冊表項foreach (string strRNum in retkey.GetSubKeyNames() /判斷是否注冊if (strRNum = softreg.getRNum() /判斷注冊碼是否相同this.Text = "主窗體(已注冊)"button1.Enabled = false;return;this.Text = "主窗體(未注冊)"button1.Enabled = true;MessageBox.
15、Show("您現在使用的是試用版,該軟件可以免費試用30次!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);Int32 tLong;try/獲取軟件的已經使用次數tLong = (Int32)Registry.GetValue("HKEY_LOCAL_MACHINE/SOFTWARE/tryTimes", "UseTimes", 0);MessageBox.Show("感謝您已使用了" + tLong + "次&qu
16、ot;, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);catch/首次使用軟件Registry.SetValue("HKEY_LOCAL_MACHINE/SOFTWARE/tryTimes", "UseTimes", 0, RegistryValueKind.DWord);MessageBox.Show("歡迎新用戶使用本軟件", "提示", MessageBoxButtons.OK, MessageBoxIcon.Inform
17、ation);/獲取軟件已經使用次數tLong = (Int32)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);elseMessag
18、eBox.Show("試用次數已到", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);Application.Exit(); /退出應用程序上面的代碼中用到getRNum方法,該方法用來根據指定的機器碼生成注冊碼,實現代碼如下:/生成注冊碼public string getRNum()setIntCode(); /初始化127位數組for (int i = 1; i < Charcode.Length; i+) /把機器碼存入數組中Charcodei = Convert.ToChar(thi
19、s.getMNum().Substring(i - 1, 1);for (int j = 1; j < intNumber.Length; j+) /把字符的ASCII值存入一個整數組中。intNumberj = intCodeConvert.ToInt32(Charcodej) + Convert.ToInt32(Charcodej);string strAsciiName = "" /用于存儲注冊碼for (int j = 1; j < intNumber.Length; j+)if (intNumberj >= 48 && intNu
20、mberj <= 57) /判斷字符ASCII值是否09之間strAsciiName += Convert.ToChar(intNumberj).ToString();else if (intNumberj >= 65 && intNumberj <= 90) /判斷字符ASCII值是否AZ之間strAsciiName += Convert.ToChar(intNumberj).ToString();else if (intNumberj >= 97 && intNumberj <= 122) /判斷字符ASCII值是否az之間st
21、rAsciiName += Convert.ToChar(intNumberj).ToString();else /判斷字符ASCII值不在以上范圍內if (intNumberj > 122) /判斷字符ASCII值是否大于zstrAsciiName += Convert.ToChar(intNumberj - 10).ToString();elsestrAsciiName += Convert.ToChar(intNumberj - 9).ToString();return strAsciiName; /返回生成的注冊碼在frmMain窗體中單擊“注冊”按鈕時,彈出“軟件注冊”窗體,該
22、窗體加載時自動獲得本機機器碼,實現代碼如下:private void frmRegister_Load(object sender, EventArgs e)textBox1.Text = softreg.getMNum();上面的代碼中用到getMNum方法,該方法為自定義的返回值類型為string類型的方法,它主要用來根據本機的CPU和硬盤序列號生成本機機器碼。getMNum方法實現代碼如下:/生成機器碼public string getMNum()string strNum = getCpu() + GetDiskVolumeSerialNumber(); /獲得24位Cpu和硬盤序列號
23、string strMNum = strNum.Substring(0, 24); /從生成的字符串中取出前24個字符做為機器碼return strMNum; /返回生成的機器碼getMNum方法中用到getCpu和GetDiskVolumeSerialNumber兩個自定義方法,其中getCpu方法用來獲取本機CPU序列號,GetDiskVolumeSerialNumber方法用來獲取本機硬盤序列號,它們的實現代碼如下:/獲得CPU的序列號public string getCpu()string strCpu = null;ManagementClass myCpu = new Manage
24、mentClass("win32_Processor"); /獲取系統(tǒng)CPU處理器ManagementObjectCollection myCpuConnection = myCpu.GetInstances();foreach (ManagementObject myObject in myCpuConnection)strCpu = myObject.Properties"Processorid".Value.ToString(); /獲取CPU序列號break;return strCpu;/ 取得設備硬盤的序列號public string GetD
25、iskVolumeSerialNumber()/獲取系統(tǒng)硬盤ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid="d:"");disk.Get();return disk.GetPropertyValue("VolumeSerialNumber").ToString()
26、; /返回硬盤序列號frmRegister窗體中單擊“注冊”按鈕時,程序首先判斷是否輸入注冊碼,如果沒有,彈出信息提示,否則判斷用戶輸入的注冊碼與本機應該生成的注冊碼是否相同,如果相同,則注冊成功,并將軟件注冊信息寫入到注冊表中?!白浴卑粹o的Click事件代碼如下:private void button1_Click(object sender, EventArgs e)if (textBox2.Text = "") /判斷是否輸入了注冊碼MessageBox.Show("注冊碼輸入不能為空!", "警告", MessageBoxB
27、uttons.OK, MessageBoxIcon.Warning);elseif (textBox2.Text.Equals(softreg.getRNum() /判斷注冊碼是否正確RegistryKey retkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("software", true).CreateSubKey("mrwxk").CreateSubKey("mrwxk.ini").CreateSubKey(textBox2.Text); /打開注冊表項,并創(chuàng)建一個
28、子項retkey.SetValue("UserName", "mrsoft"); /為新創(chuàng)建的注冊表項設置值MessageBox.Show("注冊成功,程序需要重新加載!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);this.Hide(); /隱藏當前窗體frmMain frmmain = new frmMain() /實例化主窗體對象;frmmain.Show(); /顯示主窗體elseMessageBox.Show("注冊碼輸入錯
29、誤!", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);-代碼示例:注冊類:using System;using System.Collections.Generic;using System.Text;using System.Management;namespace SoftRegister public class SoftReg /<summary> / 獲取硬盤卷標號 /</summary> /<returns></returns> private st
30、ring GetDiskVolumeSerialNumber() ManagementClass mc = new ManagementClass("win32_NetworkAdapterConfiguration"); ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid="c:""); disk.Get(); return disk.GetPropertyValue("VolumeSerialNumber").ToSt
31、ring(); /<summary> / 獲取CPU序列號 /</summary> /<returns></returns> private string GetCpu() string strCpu = null; ManagementClass myCpu = new ManagementClass("win32_Processor"); ManagementObjectCollection myCpuCollection = myCpu.GetInstances(); foreach (ManagementObject
32、myObject in myCpuCollection) strCpu = myObject.Properties"Processorid".Value.ToString(); return strCpu; /<summary> / 生成機器碼 /</summary> /<returns></returns> public string GetMNum() string strNum = GetCpu() + GetDiskVolumeSerialNumber(); string strMNum = strNum.Substr
33、ing(0, 24); /截取前24位作為機器碼 return strMNum; private int intCode = new int127; /存儲密鑰 private char charCode = new char25; /存儲ASCII碼 private int intNumber = new int25; /存儲ASCII碼值 /初始化密鑰 private void SetIntCode() for (int i = 1; i < intCode.Length; i+) intCodei = i % 9; /<summary> / 生成注冊碼 /</su
34、mmary> /<returns></returns> 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) +
35、 intCodeConvert.ToInt32(charCodej); string strAsciiName = "" /注冊碼 for (int k = 1; k < intNumber.Length; k+) /生成注冊碼 if (intNumberk >= 48 && intNumberk <= 57) | (intNumberk >= 65 && intNumberk <= 90) | (intNumberk >= 97 && intNumberk <= 122) /判斷如果
36、在0-9、A-Z、a-z之間 strAsciiName += Convert.ToChar(intNumberk).ToString(); else if (intNumberk > 122) /判斷如果大于z strAsciiName += Convert.ToChar(intNumberk - 10).ToString(); else strAsciiName += Convert.ToChar(intNumberk - 9).ToString(); return strAsciiName; / <summary> / 注冊是否通過 / </summary>
37、/ <param name="regstr"></param> / <returns></returns> public bool IsReg(string regstr) string reg = GetRNum(GetMNum(); if (reg = regstr) return true; else return false; 注冊驗證 private bool GetReg() /判斷軟件是否注冊 RegistryKey retkey = Registry.CurrentUser.OpenSubKey("S
38、OFTWARE", 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 intNumb
39、er = 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
40、sender, EventArgs e) Application.Exit(); /<summary> / 生成注冊碼 /</summary> /<returns></returns> 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 <
41、intNumber.Length; j+) /改變ASCII碼值 intNumberj = Convert.ToInt32(charCodej) + intCodeConvert.ToInt32(charCodej); string strAsciiName = "" /注冊碼 for (int k = 1; k < intNumber.Length; k+) /生成注冊碼 if (intNumberk >= 48 && intNumberk <= 57) | (intNumberk >= 65 && intNumbe
42、rk <= 90) | (intNumberk >= 97 && intNumberk <= 122) /判斷如果在0-9、A-Z、a-z之間 strAsciiName += Convert.ToChar(intNumberk).ToString(); else if (intNumberk > 122) /判斷如果大于z strAsciiName += Convert.ToChar(intNumberk - 10).ToString(); else strAsciiName += Convert.ToChar(intNumberk - 9).ToStr
43、ing(); return strAsciiName; C#(WinForm)實現軟件注冊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 /<summary> 12 / 獲取硬盤卷標號 13 /</summary> 14 /<retur
44、ns></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.Get
45、PropertyValue("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 ManagementO
46、bjectCollection 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
47、> 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 int25;
48、 /存儲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 /<summary> 64 / 生成注冊碼 65 /</summary> 66 /<returns></returns> 67 public string GetRNum() 68 69 SetIntCode(); 70 string strMNum = GetMNum(); 71
49、 for (int i = 1; i < charCode.Length; i+) /存儲機器碼 72 73 charCodei =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 = "" /
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 燒烤經營知識培訓課件
- 電子政務協(xié)同創(chuàng)新合作協(xié)議
- 行業(yè)知識培訓課件框架圖
- 云南省西雙版納第一中學等四校2024-2025學年七年級上學期期末地理試卷(含答案)
- 服務續(xù)費協(xié)議合同
- 企業(yè)品牌傳播策略服務合同
- 城市環(huán)保治理項目合作協(xié)議
- 公司員工保密協(xié)議內容及責任追究條款
- 白酒銷售合同協(xié)議書
- IT行業(yè)技術發(fā)展趨勢測試題集錦
- 公司內部辦公用品采購預算表
- 四川省南充市2025屆高三下學期高考適應性考試(二診)語文試題(含答案)
- 湖北省2025屆高三下學期2月調考語文試題及參考答案
- 2025年湖南國防工業(yè)職業(yè)技術學院單招職業(yè)技能測試題庫完整版
- 2025年《地陪導游服務程序》公開課標準教案
- 愛耳日完整課件
- 2025年國電投核能限公司招聘高頻重點模擬試卷提升(共500題附帶答案詳解)
- 云南省2025年中考化學第三次模擬考試試題含答案
- 系統(tǒng)集成項目售后服務方案
- 2024年南寧市良慶區(qū)招聘專職化城市社區(qū)工作者筆試真題
- 蘇科版(2025新版)八年級下冊物理第七章 力 單元測試卷(含答案)
評論
0/150
提交評論