WinForm应用程序之注册模块的设计与实现

Posted on 2012-11-13 10:21 星星之火116 阅读(3260) 评论(4) 编辑 收藏

我们在安装一些桌面应用程序的时候,往往在会有提示当前用户使用的是试用版,要进行注册。刚好最近做了一个关于应用程序注册的小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");//打开系统的注册表项,Registry.LocalMachine包含本地计算机的配置数据。该字段读取 Windows 注册表基项 HKEY_LOCAL_MACHINE,OpenSubKey("SOFTWARE")表示打开本地计算机配置数据下SOFTWARE子项

            if (rk.GetValue("ZCM") != null)//获取程序的注册码的值,如果已经注册则有值,此时注册按钮隐藏,未注册时,值为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;//这里只是一个demo所以只要用户点击登录就可以登录成功,这里只是将DialogResult的值设为OK,并没有直接显示Form2主窗体,因为在登录成功后,Form1登录窗体也就没有用了,所以程序在运行的时候,主线程并非Form1而是From2,因此还需要在Program.cs文件里进行设置。

        }

在Program.cs文件里设置如下:

static void Main()

        {

            Application.EnableVisualStyles();

            Application.SetCompatibleTextRenderingDefault(false);

           <span style=""> Form1 f1 = new Form1();

            if (f1.ShowDialog() == DialogResult.OK)//表示当f1的DialogResult等于Ok时主程序才开始运行,所以在Form1中登录成功时要将Dialogresult设为OK

            {

                Application.Run(new Form2());

            }

</span>        }

四、这时如果要进行注册的话,我们就来看一下注册窗体(Register)里边的代码

1、首先看Register_Load事件里的方法

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、然后看注册按钮里的处理事件

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("请输入注册码!");

           }

       }

五、下面就进入最关键的一部分了,不论用户是否注册,都可以让用户进入程序的主界面,但是如果用户未注册则判断其使用次数是否超过限定的试用次数,如果超过则不能使用,反之则仍可继续试用,并在每次使用时提醒用户剩余试用次数,如果已经注册,则可以获得所有的权限功能。下面看具体的代码实现

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

来做演示。

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事件中还有一些注释的代码如下:

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文件中,这也是一个用来检测用户是否注册的思路,在用户进行注册的时候将注册码写入文本文件中,在登录的时候以打开或者新建的方式从文件中读取注册码,如果已经注册,则可读取到注册码,如果未注册,则显示未注册,并提示用户注册。

这里只是提供一个思路,希望能给大家带来一些帮助,还请大家多多指点。

时间: 2024-08-06 11:55:08

WinForm应用程序之注册模块的设计与实现的相关文章

登录及注册模块设置与流程图

原文地址:http://www.cocoachina.com/design/20170320/18918.html 一.登录/注册模块流程图 1.电商&O2O类产品下单注册逻辑 2.类似于简书&知乎等内容型社区产品 二.关于注册流程 1.同一页面中完成注册 较适合填写信息较少(往往不包含关于用户个人信息的设置),注册流程简洁的产品,这类产品的注册所需的信息往往只包含:手机号.验证码.密码等最简单的信息. 在同一页面中完成注册,能够能够让用户对整个注册流程有个心理预期,对填写的信息能够进行预

在WinForm应用程序中快速实现多语言的处理(2)--开发框架模块的整合

我在上篇随笔<在WinForm应用程序中快速实现多语言的处理>里面介绍了Winform开发中多语言的处理解决方案,整个多语言解决方案是以实际需求为驱动,以减少代码改动,高效处理为目的,通过基类继承的方式减少代码修改,通过引入翻译API方式减少翻译处理时间,本随笔继续深化这个多语言处理方案的介绍,是指整合在开发框架中进行无缝的使用. 1.多语言的处理步骤 1)提取多语言处理JSON文件 我们通过把程序界面或者代码里面的中文提取出来,放到JSON文件中,对不同模块可以分为不同的JSON文件,如下所

PHP+jQuery 简单注册模块

/* ******* 环境: Apache2.2.8 + PHP5.2.6 + MySQL5.0.51b + jQuery-1.8.3.min.js ************** 其他组件:Zend_mail( Zend_framework 1.11.11 )******* Date:2014-09-25******* Author:小dee******* Blog:http://www.cnblogs.com/dee0912/*/ 写了一个简单的PHP+jQuery注册模块,需要填写的栏目包括

Java SSH框架系列:用户登录模块的设计与实现思路

时间 2014-01-19 16:14:54  CSDN博客原文  http://blog.csdn.net/nupt123456789/article/details/18504615 1.简介 用户登录模块,指的是根据用户输入的用户名和密码,对用户的身份进行验证等.如果用户没有登录,用户就无法访问其他的一些jsp页面,甚至是action都不能访问. 二.简单设计及实现 本程序是基于Java的SSH框架进行的. 1.数据库设计 我们应该设计一个用户表,其Userinfo表,对应的SQL语句为(

WinForm 应用程序的打包和部署_简单版(图文)(转)

开发好了一个 WinForm 系统,如何使之可以平稳的运行在没有安装 .NET Framework 的操作系统上?这就涉及到打包和部署的内容,通过打包和部署形成安装程序,实现 WinForm 应用软件正常的安装在客户的操作系统上.另一方面同时需要考虑通过打包和部署形成卸载程序,将该应用软件卸载掉,达到方便客户使用的目的. (一) 创建部署项目 在 VS 环境下,单击“文件” → “新建” → “项目”,打开“新建项目”对话框,从“项目类型”列表中选择“安装和部署项目”,在对话框右边的“模板”列表

Java入门:用户登录与注册模块1(实践项目)——分析

任务描述:用户登录与注册是大多数软件都拥有的一个模块.请编写一个控制台程序,实现用户的登录与注册功能,并且用户能够修改自己信息. [需求分析]由于本程序是一个演示程序,用户的信息我们做简化处理,仅包括:用户名.密码和EMAIL. 1.系统功能分析 分析一个系统或一个模块,我们首先需要了解系统需要实现哪些功能,通常可采用用例图来描述分析结果.对于本任务,用例图为: 对于每个用例,可以使用用例描述表来详细阐述用例内容.用户登录注册模块的三个用例描述表如下: (1)登录用例描述表 用例名称 登录 标识

.NET 基础 一步步 一幕幕[Winform应用程序]

时隔半载,重回博客园,一切从头再来,今天只是开始,原谅我这一生放荡不羁爱自由. 进入今天得主题曲:Winform应用程序(简介) 1.      winform应用程序是一种智能客户端技术,我们可以使用winform应用程序,帮助我们获得信息或者传输信息等. 2.      winform控件得属性: Name:在后台要获得前台的控件对象,需要使用Name属性. visible:指示一个控件是否可见. Enabled:指示一个控件是否可用. 3. 在Main函数当中创建的窗体对象,我们称之为这个

加密狗复制备份 订制写狗程序 算法注册机 OEM信息 二次封装

加密狗复制备份.模拟  行业软件批发零售 定制写狗程序.注册机 软件破解 逆向工程   酒店客房管理.餐饮娱乐管理.美容美发管理.汽车行业.会员管理.医疗软件.客户管理.财务进销存系统 .OA办公 .服装设计 等大量行业软件批发零售 合作联系QQ: 844256300 =========================================================================================== 企发会员积分系统3.5 冠唐仓库管理网络版 凤

跟我一起学extjs5(11--自定义模块的设计)

跟我一起学extjs5(11--自定义模块的设计) 从这一节开始我们来设计并完成一个自定义模块.我们先来确定一个独立的模块的所能定义的一些模块信息.以下信息只是我自己在开发过程中想到或用到的,希望有新的想法的或者有建议的跟贴回复. 一个独立模块包含以下信息: 1.模块的基本信息 模块ID号:一个数字的ID号,可以根据此ID号的顺序将相同分组的模块放在一块. 模块分组:模块分到哪个组里,比如说业务模块1.业务模块2.系统设置.系统管理等. 模块标识:系统中唯一的模块的标识,一般这个标识等同于数据库