我们在安装一些桌面应用程序的时候,往往在会有提示当前用户使用的是试用版,要进行注册。刚好最近做了一个关于应用程序注册的小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事件里做如下处理:
private void Form1_Load( object sender,
EventArgs e)
{
skinEngine1.SkinFile
= "WarmColor1.ssk" ;
RegistryKey
rk = Registry.LocalMachine.OpenSubKey( "SOFTWARE" );
if (rk.GetValue( "ZCM" )
!= null )
{
btnzc.Visible
= false ;
}
}
|
注册按钮事件处理函数如下:
private void btnzc_Click( object sender,
EventArgs e)
{
Register
r = new Register();
r.Show();
}
|
登录按钮事件处理函数如下:
private void button1_Click( object sender,
EventArgs e)
{
this .DialogResult
= DialogResult.OK;
}
|
在Program.cs文件里设置如下:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault( false );
<span
style= "background-color:
#ffff00;" >
Form1 f1 = new Form1();
if (f1.ShowDialog()
== DialogResult.OK)
{
Application.Run( new Form2());
}
</span>
}
|
四、这时如果要进行注册的话,我们就来看一下注册窗体(Register)里边的代码
1、首先看Register_Load事件里的方法
private void Register_Load( object sender,
EventArgs e)
{
txtzcm.Text
= RegisterNumber.GetRegisterNumber();
}
|
2、然后看注册按钮里的处理事件
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);
MessageBox.Show( "注册成功!请再次登录!" );
}
else
{
MessageBox.Show( "您输入的注册码不正确,请再次输入!" );
}
}
else
{
MessageBox.Show( "请输入注册码!" );
}
}
|
五、下面就进入最关键的一部分了,不论用户是否注册,都可以让用户进入程序的主界面,但是如果用户未注册则判断其使用次数是否超过限定的试用次数,如果超过则不能使用,反之则仍可继续试用,并在每次使用时提醒用户剩余试用次数,如果已经注册,则可以获得所有的权限功能。下面看具体的代码实现
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);
MessageBox.Show( "感谢你已经使用了" +
count + "次,请先注册再使用!" );
tabc.Visible
= false ;
if (count
< 30)
{
rk.SetValue( "Count" ,
count + 1);
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该主键包含了文件的扩展名和应用程序的关联信息以及WindowShell和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(stringname)方法主要是打开指定的子键。GetSubKeyNames()方法是获得主键下面的所有子键的名称,它的返回值是一个字符串数组。GetValueNames()方法是获得当前子键中的所有的键名称,它的返回值也是一个字符串数组。GetValue(stringname)方法是指定键的键值。
我们在该示例中都有用到这些方法,下面分别为大家演示:
需要声明一下的是为了方便使用,Registry类提供了7个公共的静态域,分别代表7个基本主键分别是:Registry.ClassesRoot,Registry.CurrentUser,Registry.LocalMachine,Registry.Users,Registry.CurrentConfig这里我们以Registry.LocalMachine
来做演示。
RegistryKey
rk=Registry.LocalMachine.OpenSubKey( "SOFTWARE" , true ");
RegistryKey
rk1=rk.CreateSubKey( "Hello" ,RegistryKeyPermissionCheck.ReadWriteSubTree);
rk.SetValue( "Count" ,0);
rk.GetValue( "Count" ,0);
rk.DeleteValue( "Count" );
rk.DeleteSubKey( "Hello" );
|
有细心的朋友可能会发现上边在Register(注册窗体)的Load事件中还有一些注释的代码如下:
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文件中,这也是一个用来检测用户是否注册的思路,在用户进行注册的时候将注册码写入文本文件中,在登录的时候以打开或者新建的方式从文件中读取注册码,如果已经注册,则可读取到注册码,如果未注册,则显示未注册,并提示用户注册。
这里只是提供一个思路,希望能给大家带来一些帮助,还请大家多多指点。
相关推荐
此 SOA 解决方案包含提供硬件数据的 Windows 服务和具有不同模块的 WinForm 消费者应用程序(理想情况下,每个可用硬件传感器都有一个模块)。 我尝试以低耦合的方式开发项目,因此可以在对现有源代码影响最小的情况...
基岩 用于winform应用程序的MVVM插件框架。 基岩能做什么? 按需动态加载模块。 因此,在这种情况下,每个模块可以是...为winform应用程序实现MVVM模式 解耦组件,例如服务,存储库,视图模型,使您轻松编写单元测试。
万用报表打印系统基于DataSet的数据结构,保证了大多数应用程序对打印功能的需求,此系统包含许多人性化的设置,能够方便的自定义需要打印的报表的头文件、可以实现报表的套打、分页、纸张的设置(包含自定义纸张...
C#界面设计典例,WInform界面开发系列的介绍,主要针对性介绍Winform开发过程中,经常用到的模块:数据字典模块、参数配置模块、权限管理模块的模块化应用,以及各模块的分合之道。
2.3.2 客户端注册模块设计 40 2.3.3 客户端登录模块设计 42 2.3.4 客户端QQ模块设计 43 2.3.5 客户端消息发送模块设计 48 2.3.6 服务器端控制台模块设计 52 第3章 SQL数据表提取器模块 ...
基于 RestfuAPI 的项目实施管理系统的实现原理非常清晰,其主要目的是实现项目实施的进度管理,其次附带一些辅助性的功能,其目的是提高用户的用户体验以及应用程序的多元化、丰富应用程序的内涵、充实应用程序的...
// 获取应用程序的当前工作目录。 System.IO.Directory.GetCurrentDirectory() // 获取和设置包括该应用程序的目录的名称。 System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase // 获取启动了应用...
Winform使用技巧,实战...详细介绍了一些Winform框架的各种功能和模块,以及如何使用Winform进行GUI开发、网络编程和跨平台应用开发等。 适用于初学者和有经验的开发者,能够帮助你快速上手Winform并掌握其高级特性。
这是我09年到11年左右可以缩短时间编写的项目,最初的想法很简单,做一个能拖拖拽拽就直接生成应用程序的工具,不用写代码,把能想到的业务操作全部封装起来,通过配置的方式把这些业务操作组织起来运行。...
Winform使用技巧,实战...详细介绍了一些Winform框架的各种功能和模块,以及如何使用Winform进行GUI开发、网络编程和跨平台应用开发等。 适用于初学者和有经验的开发者,能够帮助你快速上手Winform并掌握其高级特性。
Oqtane框架Oqtane是Blazor的模块化应用程序框架Oqtane使用Blazor(一种用于.NET Core的新Web框架),使您可以使用C#而不是JavaScript来构建交互式Web UI。 Blazor应用程序由re Oqtane Framework组成。Oqtane是...
本文实例汇总了winform获取当前名称的方法。分享给大家供大家参考。具体方法如下: 代码如下:// 获取程序的基目录。 System.AppDomain.CurrentDomain....// 获取应用程序的当前工作目录。 System.IO.Directory.GetCu
WinForm实现个人日程管理 2.1 案例简介 2.2 应用程序概述 2.3 方案设计 2.3.1 应用程序前端的设计 2.3.2 后端数据库表的设计 2.3.3 后端数据库表间逻辑 2.3.4 后端数据库存储过程的设计 2.4...
C#、WPF使用技巧,实战应用开发小系统...详细介绍了一些WPF框架的各种功能和模块,以及如何使用WPF进行GUI开发、网络编程和跨平台应用开发等。 适用于初学者和有经验的开发者,能够帮助你快速上手WPF并掌握其高级特性。
ASP.NET 2.0使用Web Part创建应用程序之二(共二) 体验 .net2.0 的优雅(2) -- ASP.net 主题和皮肤 NET2.0系列介绍(一).NET 2.0 中Web 应用程序主题的切换 ASP.NET 2.0 中Web 应用程序主题的切换 2.0正式版中...
它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面。 WPF(Windows Presentation Foundation)是由微软开发的桌面应用程序框架,用于...
它能够帮助你把应用程序分离成一个个松耦合、高内聚的模块,然后用一种灵活的方式组装起来。通过使用Ninject配套你的软件架构,那么代码将会变得更加容易编写、重用性强、易于测试和修改。 MVC4 配合 Ninject 3 更...
使用VS .net框架下WinForm程序应用开发。 C#开发的串口通信小工具。 相比于QT添加的串口类,WinForm是通过组件的形式将串口加入到程序中。、 在创建完windows窗体之后,添加组件类,就可以将串口加入到其中。 ...
4.应用反射动态加载应用程序里面的表单,实现如下: https://img-blog.csdnimg.cn/8d04710c2b37447fb06880b1be9cfd49.png 5.整体效果图如下: ...