一、思路:
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/