C#-用Winform製作一個簡單的密碼管理工具
阿新 • • 發佈:2020-08-09
## 為什麼要做?
首先是為了練習一下c#。
想必大家都有過記不起某個平臺的賬號密碼的經歷,那種感受著實令人抓狂。那這麼多賬號密碼根本記不住!我之前用`python`寫過一個**超級簡單**(連賬號資訊都寫在程式碼裡那種)的控制檯程式用來給我提示密碼,但是我想新增一個賬號時直接被麻煩到吐。 所以我才想用`Winform`做一個簡單的小工具來幫助我記憶。(**僅供我自己使用**(所以介面會比較醜。。),但是我會把程式碼貼出來所以有點c#基礎的其實都可以自己做一個)
## 設想
我的需求非常簡單
1. 在我需要的時候,輸入一個平臺能把對應的賬號密碼顯示出來
2. 能夠新增賬號資訊
還有一點就是在查詢賬號之前需要輸入一個口令來驗證身份,這個口令只有我自己知道(我把它存在了`app.config`檔案中,後續如果有需要可以擴展出更改口令的功能),所以即使別人用我的電腦執行起來這個程式,他不知道口令也是沒用的。
## 賬號資訊怎麼存?
我曾經想要用`SQL Server`存,畢竟`c#`與它如此親近,但是我要存的東西本質上只是一些字串,感覺有點大材小用所以沒有選擇`SQL Server`。最近學了JS瞭解了一些`json`的知識發現`json`檔案是個很好的選擇於是我便決用它了。但是我還不會用c#處理json資料呀。於是我又去網上找方法,然後我就發現了[`newtonsoft.json(json.NET)`](https://www.newtonsoft.com/json) ,它時一款`.NET`中開源的json序列化與反序列化工具。有了它,就可以解決我的問題了。
## code
首先把入口介面搭建起來,一個超級簡單的窗體,只放了三個控制元件。
![入口](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7556c1ae60a74d97afa36ac25b991e1b~tplv-k3u1fbpfcp-zoom-1.image)
為了方便操作給它加一個退出的快捷鍵ESC。非常簡單隻需要在`KeyDown`事件中寫下如下程式碼:
```c#
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode==Keys.Escape)
{
this.Close();
}
}
```
然後是確定這個按鈕的功能:當輸入正確的口令後,點選`確定`可以進入到下一個介面。
### 口令放在哪?
我將口令這個資料放在了`App.config`檔案中,在解決方案資源管理器中右鍵新增新建項就可以新增它了。然後向其中加入如下程式碼:
```
```
然後給剛才的入口窗體新增一個欄位`CMD`並用`ConfigurationManager`將剛才的配置讀取出來賦值給它:
```c#
public readonly string CMD=ConfigurationManager.AppSettings["CMD"].ToString() ;
```
上面的`確定`按鈕的功能是口令正確是將下個介面顯示出來,所以我們先把下個介面創建出來:
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0c3df09e7916441c904473b755a9b306~tplv-k3u1fbpfcp-zoom-1.image)
有了這個介面,就可以去寫第一個介面中`確定`按鈕的點選事件了:
```c#
private void button1_Click(object sender, EventArgs e)
{
;
string entered_cmd = textBox1.Text;
if(entered_cmd.Equals(CMD))
{
(new GetPwd()).Show();
this.Hide();
}
else
{
MessageBox.Show("錯誤!","警告",MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
```
這樣第一個介面的程式碼就寫完了(沒錯就是這麼簡單)。
### 賬號資訊查詢介面
也就是上面的第二個窗體。它載入的初始狀態是這樣:
![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ab12a592b50e48fd84edaeb8d693717d~tplv-k3u1fbpfcp-zoom-1.image)
用於顯示賬號和密碼的兩個文字框我設定成了不可見(當輸入的平臺是存在的並點選確定就可以看到了)和只讀。像這樣:
![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/505a18d0c5e64cc5a8430d130a4c7dc9~tplv-k3u1fbpfcp-zoom-1.image)
#### 一個小問題
和上一個窗體一樣,我也給這個窗體綁定了enter(相當於點選確定按鈕)和esc快捷鍵。但是當我關閉這個窗體時,已經無法再進行任何操作了可是這個程式程序卻沒有結束。怎麼解決這個問題呢?前段時間學習了委託於是我想到了一個比學校老師曾經教過的更好的方法(當時還沒學習委託,老師教的是把第一個窗體物件傳遞給第二個窗體):給第二個窗體定義一個委託欄位` public Action close_main;`然後在顯示該窗體是將前一個窗體的`close()`方法傳遞過來即可。
前面的程式碼修改一下:
```c#
(new GetPwd() {close_main=this.Close}).Show();
```
然後在第二個窗體的`FormClosed`事件中執行這個方法就可以了。
```c#
private void GetPwd_FormClosed(object sender, FormClosedEventArgs e)
{
close_main();
}
```
## 查詢
所有的賬號資訊我都放在一個json檔案中:`PWD.json`,有關對其的各種邏輯性操作我抽成了一個類`Manager`:
```C#
class Manager
{
public static string GetjsonString()
{
// 獲取整個json字串
if(!File.Exists(Path.GetFullPath(@"..//..") + ".../PWD.JSON"))
{
File.Create(Path.GetFullPath(@"..//..") + ".../PWD.JSON");
}
StreamReader jsonFile = File.OpenText(Path.GetFullPath(@"..//..") + ".../PWD.JSON");
string res = jsonFile.ReadToEnd();
jsonFile.Close();
return res;
}
public sta