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<string>("IsAutoBoot");

2.記住密碼

這裡簡單說一下邏輯順序就好了,複選框change事件可以不作處理,在用戶登錄成功的時候判斷記住密碼的複選框是否打勾就好了,如果為true將賬戶密碼和IsRememberPwd都寫入json文件,登錄失敗則不處理。

3.自動登錄

在記住密碼的前提上再加判斷就行了,在窗體載入事件中先判斷是否記住密碼,再判斷是否自動登錄,如果都滿足則自動執行登錄邏輯即可。(勾選自動登錄同時會將記住密碼勾上,因為記住密碼是自動登錄的前提)

下面是我自己項目中的一部分程式碼:

image
image

Tags: