WinForm应用程序的开机自启、记住密码,自动登录的实现
一、思路:
1.开机自启,自然是需要用到注册表,我们需要把程序添加到电脑的注册表中去
2.记住密码,自动登录,开机自启,在页面的呈现我们都使用复选框按钮来呈现
3.数据持久化,不能是数据库,可以是sqlite或txt、json文件。
二、数据持久化
1.这里我使用的是json文件,appsettings.json如下:
{
"IsAutoBoot": false,//开机自启
"TopMost": true,//是否永远置顶窗口
"IsAutoLogin":false,//是否自动登录
"IsRememberPwd":false,//是否记住密码
"AccountNumber": "",
"PassWord": "",
}
2.读取和写入json数据
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace YXChatFormClient.Utility
{
public class JSONHelper
{
/// <summary>
/// 读取JSON文件
/// </summary>
public static T ReadJSON<T>(string key)
{
try
{
string path = Application.StartupPath + @"\appsettings.json";
StreamReader streamReader = new StreamReader(path);
dynamic jsonObj = JsonConvert.DeserializeObject<dynamic>(streamReader.ReadToEnd());
streamReader.Close();
return (T)jsonObj[key];
}
catch (Exception e)
{
MessageBox.Show(e.Message + "/r/n" + e.StackTrace);
}
return default;
}
/// <summary>
/// 修改JSON
/// </summary>
public static void WriteJSON<T>(string key,T value)
{
try
{
string path = Application.StartupPath + @"\appsettings.json";
StreamReader streamReader = new StreamReader(path);
dynamic jsonObj = JsonConvert.DeserializeObject<dynamic>(streamReader.ReadToEnd());
jsonObj[key] = value;
streamReader.Close();
string output = JsonConvert.SerializeObject(jsonObj, Formatting.Indented);
File.WriteAllText(path, output);
}
catch (Exception e)
{
MessageBox.Show(e.Message + "/r/n" + e.StackTrace);
}
}
}
}
三、具体业务
1.开机自启
复选框的change事件:当单选框选中时,将程序添加至注册表中,未选中时从注册表中移除。并修改配置文件中IsAutoBoot的值。
private void ck_Selfstart_CheckedChanged(object sender, EventArgs e)
{
try
{
string execPath = Application.ExecutablePath;
RegistryKey rk = Registry.LocalMachine;
RegistryKey rk2 = rk.CreateSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run");
if (ck_Selfstart.Checked)
{
rk2.SetValue("MyExec", execPath);
}
else
{
rk2.DeleteValue("MyExec", false);
}
rk2.Close();
rk.Close();
JSONHelper.WriteJSON("IsAutoBoot", ck_Selfstart.Checked);
}
catch (Exception ex)
{
MessageBox.Show(string.Format("[注册表操作]向注册表写开机启动信息失败, Exception: {0}", ex.Message));
}
}
窗体加载事件中,通过读取配置文件得到是否开启开机自动启动,给单选框选中或不选中
ck_Selfstart.Checked=JSONHelper.ReadJSON<bool>("IsAutoBoot");
2.记住密码
这里简单说一下逻辑顺序就好了,复选框change事件可以不作处理,在用户登录成功的时候判断记住密码的复选框是否打勾就好了,如果为true将账户密码和IsRememberPwd都写入json文件,登录失败则不处理。
3.自动登录
在记住密码的前提上再加判断就行了,在窗体加载事件中先判断是否记住密码,再判断是否自动登录,如果都满足则自动执行登录逻辑即可。(勾选自动登录同时会将记住密码勾上,因为记住密码是自动登录的前提)
下面是我自己项目中的一部分代码:
注:这个读取json文件写的比较简单,读取嵌套的情况我没试过,还有就是当前方法可能会频繁读写文件,可以自行优化,因为我只是为了实现以上功能。大家如果有更好的解决方案可以评论留言哦
版权声明
本文首发链接为:https://www.cnblogs.com/hyx1229/p/15763483.html
作者:不想只会CURD的猿某人
更多原著文章请参考:https://www.cnblogs.com/hyx1229/