例一:http://blog.sina.com.cn/s/blog_65e635ee0100l5ny.html
例二:
MessageBox.Show("您现在使用的是试用版,该软件可以免费试用30次!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
Int32 tLong;
try
{
//获取软件的已经使用次数HKEY_CURRENT_USER
//tLong = (Int32)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\tryTimes", "UseTimes", 0);
tLong = (Int32)Registry.GetValue("HKEY_CURRENT_USER\\SOFTWARE\\tryTimes", "UseTimes", 0);
MessageBox.Show("感谢您已使用了" + tLong + "次", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch
{
//首次使用软件
//Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\tryTimes", "UseTimes", 0, RegistryValueKind.DWord);
Registry.SetValue("HKEY_CURRENT_USER\\SOFTWARE\\tryTimes", "UseTimes", 0, RegistryValueKind.DWord);
MessageBox.Show("欢迎新用户使用本软件", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
//获取软件已经使用次数
//tLong = (Int32)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\tryTimes", "UseTimes", 0);
tLong = (Int32)Registry.GetValue("HKEY_CURRENT_USER\\SOFTWARE\\tryTimes", "UseTimes", 0);
if (tLong < 30)
{
int Times = tLong + 1;//计算软件是第几次使用
//将软件使用次数写入注册表
//Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\tryTimes", "UseTimes", Times);
Registry.SetValue("HKEY_CURRENT_USER\\SOFTWARE\\tryTimes", "UseTimes", Times);
this.Close();//关闭本次操作窗口
}
else
{
MessageBox.Show("对不起,您的免费试用次数已达上限,请进行注册使用!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
Application.Exit();//关闭整个应用程序
}
例一:https://blog.csdn.net/cuoban/article/details/50492895
例二:https://www.cnblogs.com/chuangjie1988/articles/6647224.html
例三:固定截止时间/灵活截止时间
static class Program
{
///
/// 应用程序的主入口点。
///
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
WriteRegName();
DateTime dt0 = SelectRegName();
//方法一:使用dt1表示固定截止时间
DateTime dt1 = new DateTime(2022,1,10,10,30,30);
int count = DateTime.Compare(DateTime.Now,dt1);
//DateTimedt1程序停止
if (count == -1 || count==0)
{
Application.Run(new Form1());
}
else
{
Application.Exit();
}
//方法二:使用灵活截止时间:将第一次启动时间写入,dt0为第一次启动时间
int count = DateTime.Compare(DateTime.Now,dt0.AddMonths(6));
//DateTime<.AddMonths(6)程序运行,DateTime>.AddMonths(6)程序停止
if (count == -1 || count==0)
{
Application.Run(new Form1());
}
else
{
Application.Exit();
}
}
///
/// 判断启动项目录是否存在
///
///
///
static bool RegeditDirIsExist(string dirName)
{
RegistryKey key;
RegistryKey subkey;
key = Registry.LocalMachine;
string fullDir = "software\\microsoft\\windows\\currentVersion\\";
subkey = key.OpenSubKey(fullDir, true);
foreach (string keys in subkey.GetSubKeyNames())
{
if (keys.ToLower() == dirName.ToLower())
{
return true;
}
}
return false;
}
///
/// 写键值
///
static void WriteRegName()
{
string DirectoryName = Directory.GetCurrentDirectory(); //获取当前目录
string regName = "WFText.exe"; //加入启动项里的节点名
RegistryKey key;
RegistryKey subkey;
RegistryKey mainkey;
string fullDir = "software\\microsoft\\windows\\currentVersion\\";
string dir = "run"; ///注册表目录
string filePath = DirectoryName + "\\" + regName; //此处注意是系统程序(如:xp下的C:\windows\system32)的话,直接写文件名即可,否则要完整的路径
key = Registry.LocalMachine; //初始化subkey,操作HKEY_LOCAL_MACHINE\software\microsoft\windows\currentVersion\子项
subkey = key.OpenSubKey(fullDir, true);
//目录不存在则创建该目录
if (!RegeditDirIsExist(dir))
{
subkey.CreateSubKey(dir);
}
//以可写的方式打开目录
mainkey = key.OpenSubKey(fullDir + dir, true);
//第一次启动时写入当前时间(此方法理论上可行,但是调试时设置好一个时间后正式使用时仍为该时间)
if (mainkey.GetValue(regName) == null)
{
mainkey.SetValue(regName, DateTime.Now);
}
}
///
/// 根据键查询值
///
static DateTime SelectRegName()
{
RegistryKey key;
RegistryKey subkey;
RegistryKey mainkey;
string fullDir = "software\\microsoft\\windows\\currentVersion\\";
string dir = "run"; ///注册表目录
string regName = "WFText.exe";
key = Registry.LocalMachine; ///初始化subkey,操作HKEY_LOCAL_MACHINE\software\microsoft\windows\currentVersion\子项
subkey = key.OpenSubKey(fullDir, true);
mainkey = key.OpenSubKey(fullDir + dir, true);
DateTime dt = DateTime.Parse((string)mainkey.GetValue(regName));
return dt;
}
///
/// 删除键值
///
static void DeleteRegName()
{
RegistryKey key;
RegistryKey subkey;
RegistryKey mainkey;
string fullDir = "software\\microsoft\\windows\\currentVersion\\";
string dir = "run"; ///注册表目录
string regName = "WFText.exe";
key = Registry.LocalMachine; ///初始化subkey,操作HKEY_LOCAL_MACHINE\software\microsoft\windows\currentVersion\子项
subkey = key.OpenSubKey(fullDir, true);
mainkey = key.OpenSubKey(fullDir + dir, true);
try
{
mainkey.DeleteValue(regName);
}
catch { }
}
}
在文件夹下写入固定日期,每次打开程序时读取这个日期并且和系统时间进行比较。
public bool CheckLicence()
{
string time= ReadTxt(TimeFile);
DateTime Now = DateTime.Now;
//Thread.Sleep(2000);
//DateTime time = DateTime.Now;
DateTime dt = DateTime.ParseExact(time, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture);
if (DateTime.Now > dt)
{
MessageBox.Show("软件使用时间过期,请联系厂商");
return true;
}
else
{
// MessageBox.Show("未过期");
return false;
}
}
//读取日期
public static string ReadTxt(String filePath)
{
string strData = "";
try
{
string line;
// 创建一个 StreamReader 的实例来读取文件 ,using 语句也能关闭 StreamReader
using (System.IO.StreamReader sr = new System.IO.StreamReader(filePath))
{
// 从文件读取并显示行,直到文件的末尾
while ((line = sr.ReadLine()) != null)
{
//Console.WriteLine(line);
strData = line;
}
}
catch (Exception e)
{
// 向用户显示出错消息
//Console.WriteLine("The file could not be read:");
//Console.WriteLine(e.Message);
}
return strData;
}
//创建日期文件
private bool CreatFile(string FullFileName, string TextAll)
{
if (File.Exists(FullFileName))
{
//如果是文件已经存在;
StreamReader sr = new StreamReader(FullFileName, Encoding.Default);
string dattime = sr.ReadLine();
sr.Close();
//DateTime doe = DateTime.Now;
//long x = Convert.ToDateTime(dattime).ToFileTime();
//long y = doe.ToFileTime();
//if((x-y)>0)
//{
// MessageBox.Show("软件剩余时间是:"+(x-y));
//}
//else
//{
//MessageBox.Show("软件试用期即将到了!");
//}
return true;
}
else
{
try
{
FileStream fs = new FileStream(FullFileName, FileMode.CreateNew);
fs.Close();
StreamWriter sw = new StreamWriter(FullFileName, true, Encoding.Default); //该编码类型不会改变已有文件的编码类型
sw.WriteLine(TextAll);
sw.Close();
return true;
}
catch (Exception e)
{
MessageBox.Show(e.Message.ToString());
return false;
}
}
}
将注册时间等信息写入数据库,每次启动程序时将时间从数据库中取出并进行比较。
(1)试用软件必须联网,或者需要服务器端(比如聊天软件等客户端软件),当前时间要取服务器的时间,防止更改客户机系统时间。或者服务器上对客户机进行记录,如记录主板id,安装时间等。
注:当客户机无法上网,且不存在服务器,或者服务器就在本机时,以上做法将无法使用。
(2) 单机运行的软件可以采用一明一暗的做法,注册表是明,在硬盘的某角落,存放隐藏文件。软件需读取两处,对两处进行比较,一致则通过,不一致就退出程序。当然,安装的时候对该文件不替换。
(3)也可以在每次运行软件时先将当前日期与注册表对比,看是否过期。如未过期,就对注册表进行一次更改,更改为当前日期,那么用户即使更改系统日期,他的试用期限也在逐渐缩小。为了防止重装,仍可采用一明一暗的做法。