先来看个效果:
最近在做一外贸进口软件,也同时在完善这个飞鱼软件开发框架,界面使用Winform开发。为了用户使用方便,这不尝试增加记住用户名密码的功能,并且可以设置开机自动启动软件,一切都是为了减少用户的点击操作。
可以有多种方式来保存用户信息,比如存成本地文件、xml、注册表、更有甚者存入数据库。个人认为存到数据库里这个操作在没登陆前就发生有些不太好,先去数据库取密码回来放到输入框里等着点击感觉不太好。
最后采用了注册表的方式来保存这些信息。这里为了演示没有对保存进注册表的密码进行加密,为了安全应该继续对保存的密码加密。
private void ckbKeepInfo_CheckStateChanged(object sender, EventArgs e)
{
RegistryKey location = Registry.LocalMachine;
RegistryKey soft = location.OpenSubKey("SOFTWARE", true);//可写
RegistryKey myPass = soft.CreateSubKey("FTLiang");
myPass.SetValue("s1", tbUserName.Text);
myPass.SetValue("s2", tbPassword.Text);
myPass.SetValue("s3", ckbKeepInfo.Checked);
}
自动登陆:
private void ckbAutoStart_CheckStateChanged(object sender, EventArgs e)
{
if(ifFistIn == false)
{
RegistryKey location = Registry.LocalMachine;
RegistryKey soft = location.OpenSubKey("SOFTWARE", true);//可写
RegistryKey myPass = soft.CreateSubKey("FTLiang");
myPass.SetValue("s4", ckbAutoStart.Checked);
if (ckbAutoStart.Checked)
{
string exeDir = Application.ExecutablePath;//要启动的程序绝对路径
RegistryKey rk = Registry.LocalMachine;
RegistryKey softWare = rk.OpenSubKey("SOFTWARE");
RegistryKey microsoft = softWare.OpenSubKey("Microsoft");
RegistryKey windows = microsoft.OpenSubKey("Windows");
RegistryKey current = windows.OpenSubKey("CurrentVersion");
RegistryKey run = current.OpenSubKey(@"Run", true);//这里必须加true就是得到写入权限
run.SetValue("FTStart", exeDir);
}
else
{
string exeDir = Application.ExecutablePath;//要启动的程序绝对路径
RegistryKey rk = Registry.LocalMachine;
RegistryKey softWare = rk.OpenSubKey("SOFTWARE");
RegistryKey microsoft = softWare.OpenSubKey("Microsoft");
RegistryKey windows = microsoft.OpenSubKey("Windows");
RegistryKey current = windows.OpenSubKey("CurrentVersion");
RegistryKey run = current.OpenSubKey(@"Run", true);//这里必须加true就是得到写入权限
run.DeleteValue("FTStart");//这里必须加true就是得到写入权限
}
}
}
初始窗体显示:
private void FmLogin_Load(object sender, EventArgs e)
{
//从注册表中读取 是否保存了用户名密码 自动启动配置
try
{
RegistryKey location = Registry.LocalMachine;
RegistryKey soft = location.OpenSubKey("SOFTWARE", false);//可写
RegistryKey myPass = soft.OpenSubKey("FTLiang", false);
tbUserName.Text = myPass.GetValue("s1").ToString();
string s2 = myPass.GetValue("s2").ToString();
bool ifSave = Convert.ToBoolean(myPass.GetValue("s3"));
ckbKeepInfo.Checked = ifSave;
bool ifSave2 = Convert.ToBoolean(myPass.GetValue("s4"));
ckbAutoStart.Checked = ifSave2;
if (ifSave)
{
tbPassword.Text = s2;
}
else
{
tbPassword.Text = "";
}
ifFistIn = false; //程序已启动完毕,可以执行注册表相关动作
}
catch (Exception ex) {
//todo something
}
}