博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

winform程序如何通过操作注册表来实现限制使用次数

Posted on 2012-04-28 09:31  JmrBrvae  阅读(443)  评论(0编辑  收藏  举报

今天闲来无事,看了下以前自己写的程序,然后就找着了这个操作注册表的程序..依然还是 主要是自己记录方便以后看

先来看下效果吧..

下面贴出主要代码:

 /// <summary>
        /// 在注册表中创建一个键 并指定值
        /// </summary>
        private void SetRegeditValue()
        {
            //判断是否存在指定节点
            //如果存在 不影响  继续判断节点下的键值
            //如果不存在 则建立一个新的节点
            if (!IsThisNode("useTime"))
            {
                RegistryKey key = Registry.LocalMachine;//获取根节点
                key.CreateSubKey("SOFTWARE\\useTime");//创建指定节点
            }
            //判断是否存在指定键
            //如果不存在 则创建一个键
            //如果存在 则进行else里代码
            if (!IsThisKey("nowCount", "useTime"))
            {
                RegistryKey key = Registry.LocalMachine;//获取注册表根节点
                RegistryKey software = key.OpenSubKey("software\\useTime", true);//获取soft下的创建的节点
                software.CreateSubKey("nowCount");//创建指定键
                software.SetValue("nowCount", 14);//给指定键赋值
                MessageBox.Show("感谢您的使用试用版本,还剩14次使用机会", "温馨提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                Main m = new Main();
                m.Show();
            }
            //如果存在指定键
            else
            {
                RegistryKey Key = Registry.LocalMachine;//获取注册表根节点
                RegistryKey Zane = Key.OpenSubKey("software\\useTime", true);//获取soft下指定节点下的键
                int count = 0;
                try
                {
                    count = Convert.ToInt32(Zane.GetValue("nowCount"));//取得键值
                }
                catch (Exception ex)
                {
                    count = 0;
                }
                //大于0 每次成功运行后次数减1
                if (count>0)
                {
                    Zane.SetValue("nowCount", count - 1);
                    MessageBox.Show("感谢您的使用试用版本,还剩" + (count - 1) + "次使用机会", "温馨提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    Main m = new Main();
                    m.Show();
                }
                //等于0已经不能使用 必须注册 
                //注册我也没啥经验 就随便用了个CPU的ID编码来实现了
                else if (count == 0)
                {
                    MessageBox.Show("试用次数已经用完,请购买注册码继续使用", "温馨提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    Register r = new Register();//注册窗体 
                    r.Show();
                }
                else {
                    Main m = new Main();
                    m.Show();
                }
                Zane.Close();
            }
        }
        /// <summary>
        /// 判断注册表中是否有指定节点
        /// </summary>
        /// <param name="nodeName"></param>
        /// <returns></returns>
        private bool IsThisNode(string nodeName)
        {
            string[] subKeyName;
            RegistryKey top = Registry.LocalMachine;//得到注册表根目录下的所有节点
            RegistryKey softwatre = top.OpenSubKey("SOFTWARE");//取得soft节点
            subKeyName = softwatre.GetSubKeyNames();//取得soft节点下的所有节点名称
            foreach (string keyNames in subKeyName)//开始与指定的键对比 
            {
                if (keyNames == nodeName)
                {
                    top.Close();
                    return true;
                }
            }
            top.Close();
            return false;
        }

        /// <summary>
        /// 判断是否有健存在
        /// </summary>
        /// <param name="keyName"></param>
        /// <returns></returns>
        private bool IsThisKey(string keyName, string nodeName)
        {
            string[] subKeyName;
            RegistryKey top = Registry.LocalMachine;//得到注册表根目录下的所有节点
            RegistryKey softwatre = top.OpenSubKey("SOFTWARE\\" + nodeName);//取得soft节点下的指定节点
            subKeyName = softwatre.GetSubKeyNames();//取得soft节点下的所有键名称
            foreach (string nodeNames in subKeyName)//开始与指定的键对比 
            {
                if (nodeNames == keyName)
                {
                    top.Close();
                    return true;
                }
            }
            top.Close();
            return false;
        }

在窗口的load事件或者构造函数里调用SetRegeditValue 方面 在注册表中就会生成一个节点

 我们操作的注册表都在HK_lOCAL_MACHINE中,至于其他的都是怎么用的,我也不太清楚,以后在探究 现在主要就是说这个。。 打开选中的注册表项,你就能找到你创建的节点.. 如图:

然后就是你自己定义了 往注册表里存什么数据, 这样就能实现限制使用次数的功能..至于注册,那里就不说了,因为我写的这东西其实对于懂的人来说,改下注册表就什么都不管用了,,最好的限制使用应该就是用加密狗之类的工具..网上是这么说的,没用过.