• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#实现限制软件的使用次数

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

图1 使用次数提示

图2 软件注册
注册码可由光盘中程序文件夹下提供的注册机程序得到。
设计思路
限制软件的使用次数时,首先需要判断软件是否已经注册,如果已经注册,则用户可以任意使用软件。如果软件未注册,则判断软件是否初次使用,如果是初次使用,则在系统注册表中新建一个子项,用来存储软件的使用次数,并且设置初始值为1;如果不是初次使用,则从存储软件使用次数的注册表项中获取已经使用的次数,然后将获取的使用次数加一,作为新的软件使用次数,存储到注册表中。
技术要点
本实例获取软件使用次数时用到Registry类的GetValue方法,向注册表中写入软件使用次数时用到Registry类的SetValue方法。另外,在对软件进行注册时,需要根据硬盘序列号和CPU序列号生成机器码和注册码,此时用到WMI管理对象中的ManagementClass类、ManagementObject类和ManagementObjectCollection类,下面对本实例中用到的关键技术进行详细讲解。
(1)Registry类的GetValue方法
Registry类提供表示Windows注册表中的根项的RegistryKey对象,并提供访问项/值对的静态方法,其GetValue方法用来检索与指定的注册表项中的指定名称关联的值,如果在指定的项中未找到该名称,则返回提供的默认值;如果指定的项不存在,则返回null。GetValue方法语法格式如下:
public static Object GetValue(string keyName,string valueName,Object defaultValue)
? keyName:以有效注册表根(如“HKEY_CURRENT_USER”)开头键的完整注册表路径。
? valueName:名称/值对的名称。
? defaultValue:当name不存在时返回的值。
? 返回值:如果由keyName指定的子项不存在,则返回null;否则,返回与valueName关联的值;或者,如果未找到valueName,则返回defaultValue。
例如,下面代码用来获取软件的使用次数:
tLong = (Int32)Registry.GetValue("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_CURRENT_USER”)开头键的完整注册表路径。
? valueName:名称/值对的名称。
? value:要存储的值。
第二种重载形式语法格式如下:
public static void SetValue(string keyName,string valueName,Object value,RegistryValueKind valueKind)
? keyName:以有效注册表根(如“HKEY_CURRENT_USER”)开头键的完整注册表路径。
? valueName:名称/值对的名称。
? value:要存储的值。
? valueKind:存储数据时使用的注册表数据类型。
例如,本实例中将软件使用次数写入注册表的实现代码如下:
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)。通过该类的成员,可以使用特定的WMI类路径访问WMI数据。
例如,本实例中使用ManagementClass类对本地进程信息进行访问,代码如下:
ManagementClass myCpu = new ManagementClass("win32_Processor");
(4)ManagementObject类
ManagementObject类表示WMI实例,本实例中用到该类的Get方法、GetPropertyValue方法和Properties属性,其中Get方法用来将WMI类信息绑定到管理对象,其语法格式如下:
public void Get()
GetPropertyValue方法用来获取某属性值的等效访问器,其语法格式如下:
public Object GetPropertyValue(string propertyName)
? propertyName:相关的属性的名称。
? 返回值:指定的属性的值。
例如,本实例中获取硬盘序列号的代码如下:
ManagementObject disk = new ManagementObject("win32_logicaldisk.device>}


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#的字符串优化-String.Intern、IsInterned发布时间:2022-07-10
下一篇:
C#&amp;WPF随手小记之一——初探asyncawait实现多线程处理发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap