我們在安裝一些桌面應用程序的時候,往往在會有提示當前用戶使用的是試用版,要進行注冊。剛好最近做了一個關於應用程序注冊的小demo(這裡只是一個思路),在這裡和大家分享一下。
項目的要求是這樣的:
1. 能獲取主機硬盤序列號、網卡MAC地址、CPU編號,並按照一定的算法由此生成機器碼
2. 能根據機器碼按照一定的算法生成注冊碼
3. 未注冊時,不能使用會員管理功能
好的廢話不多說,馬上進入正題。還是一步一步通過示例向大家演示是如何實現的。
一、首先新建一個Winform應用程序,分別新建三個Form窗體分別為:Form1(登錄),Register(注冊)、Form2(主窗體)
界面布局分別如下:
二、首先,獲得主機硬盤序列號、網卡MAC地址、CPU編號,並按照一定的算法由此生成機器碼,然後再根據機器碼生成注冊碼。(為了方便大家的使用,在這裡我已經將其封裝為一個類,並導出了類模板點擊下載RegisterNumber.zip)
該類中有一下的方法
1、GetMac()//獲取網卡的MAC地址
2、GetHD()//獲取硬盤的序列號
3、GetCPU()//獲取CPU編號
4、GetMachineNumber()//根據已經獲得的MAC地址、硬盤序列號、CPU編號,組合生成機器碼
5、GetRegisterNumber()//根據生成的機器碼生成注冊碼
以上所說的方法在該RegisterNumber類中均有具體的聲明實現,有需要的朋友請自己下載使用,這裡就不再做具體的講解了,裡邊有很清楚的解釋。
三、下面先要在Form1也就是登錄窗體的Form_Load事件裡做如下處理:
[csharp]
private void Form1_Load(object sender, EventArgs e)
{
skinEngine1.SkinFile = "WarmColor1.ssk";//為皮膚控件加載文件
RegistryKey rk = Registry.LocalMachine.OpenSubKey("SOFTWARE");//打開系統的注冊表項,Registry.LocalMachine包含本地計算機的配置數據。該字段讀取 Windows 注冊表基項 HKEY_LOCAL_MACHINE,OpenSubKey("SOFTWARE")表示打開本地計算機配置數據下SOFTWARE子項
if (rk.GetValue("ZCM") != null)//獲取程序的注冊碼的值,如果已經注冊則有值,此時注冊按鈕隱藏,未注冊時,值為null,此時顯示注冊按鈕
{
btnzc.Visible = false;
}
}
注冊按鈕事件處理函數如下:
[csharp]
private void btnzc_Click(object sender, EventArgs e)
{
Register r = new Register();//顯示注冊窗體,進行注冊
r.Show();
}
登錄按鈕事件處理函數如下:
[csharp]
private void button1_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;//這裡只是一個demo所以只要用戶點擊登錄就可以登錄成功,這裡只是將DialogResult的值設為OK,並沒有直接顯示Form2主窗體,因為在登錄成功後,Form1登錄窗體也就沒有用了,所以程序在運行的時候,主線程並非Form1而是From2,因此還需要在Program.cs文件裡進行設置。
}
在Program.cs文件裡設置如下:
[csharp]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
<span style="background-color:rgb(255,255,0)"> Form1 f1 = new Form1();
if (f1.ShowDialog() == DialogResult.OK)//表示當f1的DialogResult等於Ok時主程序才開始運行,所以在Form1中登錄成功時要將Dialogresult設為OK
{
Application.Run(new Form2());
}
</span> }
四、這時如果要進行注冊的話,我們就來看一下注冊窗體(Register)裡邊的代碼
1、首先看Register_Load事件裡的方法
[csharp]
private void Register_Load(object sender, EventArgs e)
{
txtzcm.Text = RegisterNumber.GetRegisterNumber();//調用RegisterNumber的獲取注冊碼的靜態方法,獲取當前機器的注冊碼,並未文本框賦值
//FileStream fs = new FileStream(Application.StartupPath + "\\zcm.txt", FileMode.Create, FileAccess.Write);//將注冊碼寫入程序啟動項的路徑中zcm.txt文件中
//StreamWriter sw = new StreamWriter(fs, Encoding.Default);
//sw.Write(txtzcm.Text);
//sw.Close();
//fs.Close();
}
2、然後看注冊按鈕裡的處理事件
[csharp]
private void button1_Click(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(txtsr.Text))//先檢測用戶輸入是否為空
{
if (txtsr.Text == txtzcm.Text)//再檢測用戶輸入是否和顯示的注冊碼一直
{
RegistryKey rk = Registry.LocalMachine.OpenSubKey("SOFTWARE",true);
rk.SetValue("ZCM", txtsr.Text);//將注冊碼寫入系統的關於程序信息的注冊表下SOFTWARE文件下的"ZCM"名中
MessageBox.Show("注冊成功!請再次登錄!");
}
else
{
MessageBox.Show("您輸入的注冊碼不正確,請再次輸入!");
}
}
else
{
MessageBox.Show("請輸入注冊碼!");
}
}
五、下面就進入最關鍵的一部分了,不論用戶是否注冊,都可以讓用戶進入程序的主界面,但是如果用戶未注冊則判斷其使用次數是否超過限定的試用次數,如果超過則不能使用,反之則仍可繼續試用,並在每次使用時提醒用戶剩余試用次數,如果已經注冊,則可以獲得所有的權限功能。下面看具體的代碼實現
[csharp]
private void Form2_Load(object sender, EventArgs e)
{
RegistryKey rk = Registry.LocalMachine.OpenSubKey("SOFTWARE",true);
if (rk.GetValue("ZCM") != null)//讀取系統的注冊碼,如果已注冊則值值不為空可以使用,並標識已注冊,反之則未注冊
{
this.Text = "已注冊";
return;
}
this.Text = "試用版(未注冊)";
int count = (int)rk.GetValue("Count", 0);//未注冊時獲取用戶試用的次數,如果是首次使用則賦值為0
MessageBox.Show("感謝你已經使用了" + count + "次,請先注冊再使用!");
tabc.Visible = false;//因為是使用版,所以有很多 功能無法使用,這裡演示將tabControl的visible屬性設置為false來演示這種效果
if (count < 30)//默認試用次數為30次,小於30次時仍可試用,反之則直接結束運行
{
rk.SetValue("Count", count + 1);//需要更新注冊表中用來記錄登錄次數的值,每試用一次,該值就增加一,等大於等於30時,程序試用結束,直接退出
count = 30 - count;
MessageBox.Show("您試用的是試用版!還有" + count + "次試用機會,請先注冊再使用!");
}
else
{
MessageBox.Show("不好意思,請已經超出試用次數!請注冊後再使用!");
Application.Exit();
}
}
好了,到這裡程序的注冊模塊的設計和實現已經完成了,我們已經基本上可以實現了一個簡單的程序注冊,這裡主要用到了Registry類和RegistryKey類用來保存系統的注冊碼、登錄次數,下面我會向大家介紹下這兩個類。RegistryKey位於Microsoft.Win32命名空間下。
注冊表項是注冊表中的基本組織單位,相當於Windows資源管理器中的文件夾。每個具體的注冊表項都可以有子項,只要用戶具有相應的權限,且注冊表項不是基項或基項的下一級項,就可以刪除該注冊表項。每個注冊表項也可帶有與其相關聯的多個值,它們用於存儲信息,通常情況下我們可以創建一個RegistryKey(HKEY_LOCAL_MACHINE\Software)來保存有關計算機上安裝的應用程序的信息,就比如我們在本例中就是這樣使用來保存用戶試用的次數以及機器的注冊碼。下面是幾種常用主鍵:
HKEY_CLASSES_ROOT該主鍵包含了文件的擴展名和應用程序的關聯信息以及Window Shell和OLE用於儲存注冊表的信息。該主鍵下的子鍵決定了在WINDOWS中如何顯示該類文件以及他們的圖標,該主鍵是從HKEY_LCCAL_MACHINE\SOFTWARE\Classes映射過來的。
HKEY_CURRENT_USER該主鍵包含了如用戶窗口信息,桌面設置等當前用戶的信息。
HKEY_LOCAL_MACHINE主鍵包含了計算機軟件和硬件的安裝和配置信息,
該信息可供所有用戶使用HKEY_USERS該主鍵記錄了當前用戶的設置信息,每次用戶登入系統時,就會在該主鍵下生成一個與用戶登入名一樣的子鍵,該子鍵保存了當前用戶的桌面設置、背景位圖、快捷鍵,字體等信息。一般應用程序不直接訪問改主鍵,而是通過主鍵HKEY_CURRENT_USER進行訪問。
HKEY_CURRENT_CONFIG該主鍵保存了計算機當前硬件的配置信息,這些配置可以根據當前所連接的網絡類型或硬件驅動軟件安裝的改變而改變
程序中為了讀取指定主鍵下面的子鍵和子鍵中擁有的鍵值,主要使用了RegistryKey類中的四個方法:OpenSubKey,GetSubKeyNames,GetValueNames,GetValue。具體的用法和意思如下:OpenSubKey ( string name )方法主要是打開指定的子鍵。GetSubKeyNames ( )方法是獲得主鍵下面的所有子鍵的名稱,它的返回值是一個字符串數組。GetValueNames ( )方法是獲得當前子鍵中的所有的鍵名稱,它的返回值也是一個字符串數組。GetValue ( string name )方法是指定鍵的鍵值。
我們在該示例中都有用到這些方法,下面分別為大家演示:
需要聲明一下的是為了方便使用,Registry類提供了7個公共的靜態域,分別代表7個基本主鍵分別是:Registry.ClassesRoot,Registry.CurrentUser,Registry.LocalMachine,Registry.Users,Registry.CurrentConfig這裡我們以Registry.LocalMachine
來做演示。
[csharp]
RegistryKey rk=Registry.LocalMachine.OpenSubKey("SOFTWARE",true");//這裡有兩個參數,第一個參數即要打開的文件夾,第二參數為為其指定寫的權限
RegistryKey rk1=rk.CreateSubKey("Hello",RegistryKeyPermissionCheck.ReadWriteSubTree);//在SOFTWARE下創建子項,Hello,第二參數為枚舉類型即允許對其讀寫
rk.SetValue("Count",0);//在SOFTWARE下設置鍵值對,保存登錄次數
rk.GetValue("Count",0);//獲取Count值,如果當前鍵值對不存在,則默認為0
rk.DeleteValue("Count");//刪除值名稱為"Count"的鍵值對
rk.DeleteSubKey("Hello");//刪除SOFTWARE下的子項Hello
有細心的朋友可能會發現上邊在Register(注冊窗體)的Load事件中還有一些注釋的代碼如下:
[csharp] www.2cto.com
FileStream fs = new FileStream(Application.StartupPath + "\\zcm.txt", FileMode.Create, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs, Encoding.Default);
sw.Write(txtzcm.Text);
sw.Close();
fs.Close();
這段代碼的作用是將注冊碼寫入應用程序可執行文件路徑下的zcm.txt文件中,這也是一個用來檢測用戶是否注冊的思路,在用戶進行注冊的時候將注冊碼寫入文本文件中,在登錄的時候以打開或者新建的方式從文件中讀取注冊碼,如果已經注冊,則可讀取到注冊碼,如果未注冊,則顯示未注冊,並提示用戶注冊。
這裡只是提供一個思路,希望能給大家帶來一些幫助,還請大家多多指點。