C#-用Winform制作一个简单的密码管理工具
为什么要做?
首先是为了练习一下c#。
想必大家都有过记不起某个平台的账号密码的经历,那种感受着实令人抓狂。那这么多账号密码根本记不住!我之前用python
写过一个超级简单(连账号信息都写在代码里那种)的控制台程序用来给我提示密码,但是我想添加一个账号时直接被麻烦到吐。 所以我才想用Winform
做一个简单的小工具来帮助我记忆。(仅供我自己使用(所以界面会比较丑。。),但是我会把代码贴出来所以有点c#基础的其实都可以自己做一个)
设想
我的需求非常简单
- 在我需要的时候,输入一个平台能把对应的账号密码显示出来
- 能够添加账号信息
还有一点就是在查询账号之前需要输入一个口令来验证身份,这个口令只有我自己知道(我把它存在了app.config
文件中,后续如果有需要可以扩展出更改口令的功能),所以即使别人用我的电脑运行起来这个程序,他不知道口令也是没用的。
账号信息怎么存?
我曾经想要用SQL Server
存,毕竟c#
与它如此亲近,但是我要存的东西本质上只是一些字符串,感觉有点大材小用所以没有选择SQL Server
。最近学了JS了解了一些json
的知识发现json
文件是个很好的选择于是我便决用它了。但是我还不会用c#处理json数据呀。于是我又去网上找方法,然后我就发现了newtonsoft.json(json.NET)
,它时一款.NET
中开源的json序列化与反序列化工具。有了它,就可以解决我的问题了。
code
首先把入口界面搭建起来,一个超级简单的窗体,只放了三个控件。
为了方便操作给它加一个退出的快捷键ESC。非常简单只需要在KeyDown
事件中写下如下代码:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode==Keys.Escape)
{
this.Close();
}
}
然后是确定这个按钮的功能:当输入正确的口令后,点击确定
可以进入到下一个界面。
口令放在哪?
我将口令这个数据放在了App.config
文件中,在解决方案资源管理器中右键添加新建项就可以添加它了。然后向其中加入如下代码:
<appSettings>
<add key="CMD" value="123123"/>
</appSettings>
然后给刚才的入口窗体添加一个字段CMD
并用ConfigurationManager
将刚才的配置读取出来赋值给它:
public readonly string CMD=ConfigurationManager.AppSettings["CMD"].ToString() ;
上面的确定
按钮的功能是口令正确是将下个界面显示出来,所以我们先把下个界面创建出来:
有了这个界面,就可以去写第一个界面中确定
按钮的点击事件了:
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);
}
}
这样第一个界面的代码就写完了(没错就是这么简单)。
账号信息查询界面
也就是上面的第二个窗体。它加载的初始状态是这样:
用于显示账号和密码的两个文本框我设置成了不可见(当输入的平台是存在的并点击确定就可以看到了)和只读。像这样:
一个小问题
和上一个窗体一样,我也给这个窗体绑定了enter(相当于点击确定按钮)和esc快捷键。但是当我关闭这个窗体时,已经无法再进行任何操作了可是这个程序进程却没有结束。怎么解决这个问题呢?前段时间学习了委托于是我想到了一个比学校老师曾经教过的更好的方法(当时还没学习委托,老师教的是把第一个窗体对象传递给第二个窗体):给第二个窗体定义一个委托字段 public Action close_main;
然后在显示该窗体是将前一个窗体的close()
方法传递过来即可。
前面的代码修改一下:
(new GetPwd() {close_main=this.Close}).Show();
然后在第二个窗体的FormClosed
事件中执行这个方法就可以了。
private void GetPwd_FormClosed(object sender, FormClosedEventArgs e)
{
close_main();
}
查询
所有的账号信息我都放在一个json文件中:PWD.json
,有关对其的各种逻辑性操作我抽成了一个类Manager
:
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 static List<Acount> GetAcountsList()
{
//将json字符串序列化为一个集合对象
return JsonConvert.DeserializeObject<List<Acount>>(GetjsonString());
}
public static Acount SearchAcount(string platform)
{
//搜索平台为platform的账号
List<Acount> acounts = GetAcountsList();
if(acounts==null||acounts.Count==0)
{
return null;
}
var res = from a in acounts
where a.platForm == platform
select a;
return res.Count()>=1?res.First():null;
}
public static bool CheckExistence(Acount acount)
{
//检查acount 这个账号是否存在
//检查该账号是否存在
List<Acount> acounts = GetAcountsList();
var res = from a in acounts
where a.platForm==acount.platForm&&a.acount == acount.acount && a.password == acount.password
select a;
return res.Count() == 1;
}
public static void AddAcount(Acount a)
{
//添加一个账号信息
if(a.platForm==""||a.acount==""||a.password=="")
{
MessageBox.Show("请输入完整信息!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return ;
}
List<Acount> acounts = GetAcountsList();
acounts.Add(a);
string res = JsonConvert.SerializeObject(acounts);
StreamWriter jsonwriter = new StreamWriter(Path.GetFullPath(@"..//..") + ".../PWD.JSON");
jsonwriter.WriteLine(res);
jsonwriter.Close();
}
}
有了这些方法,其他地方就非常简单了。查询界面的确定
按钮点击事件:
private void button1_Click(object sender, EventArgs e)
{
Acount acount = Manager.SearchAcount(txt_platform.Text.ToLower());
if(acount!=null)
{
txt_uId.Text = acount.acount;
txt_pwd.Text = acount.password;
txt_uId.Visible = true;
txt_pwd.Visible = true;
txt_uId.ReadOnly = true;
txt_pwd.ReadOnly = true;
}
else
{
MessageBox.Show("无此账号!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
添加
第三个界面用来添加,通过第二个界面的Add
按钮呼出。
长这样:
我的设想是想要添加账号信息需要再次验证一下身份:输入一个已有的正确账号信息来通过验证,验证通过后仍然使用这个界面来添加(三个文本框依次用来输入平台、账号、密码)。这个界面只有一个按钮,验证时它的text
属性为"Check",添加时为"Add",窗体的标题也有相应的变化。该按钮的点击事件如下:
private void button1_Click(object sender, EventArgs e)
{
if(btn_check.Text=="Check")
{
if (Manager.CheckExistence(new Acount(txt_check_platform.Text.ToLower(), txt_check_uid.Text, txt_check_pwd.Text)))
{
txt_check_platform.Text = "";
txt_check_uid.Text = "";
txt_check_pwd.Text = "";
this.Text = "添加密码";
btn_check.Text = "Add";
txt_check_platform.Focus();
}
else
{
MessageBox.Show("验证失败!!", "验证反馈", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
else
{
Manager.AddAcount(new Acount(txt_check_platform.Text.ToLower(), txt_check_uid.Text, txt_check_pwd.Text));
this.close();
}
}
添加时:
另外,第三个界面也做了和前一个界面相同的快捷键和关闭处理
最后
这个程序非常非常简单,当然后续还是可以扩展许多其他功能的。虽然制作过程很简单但是我还是有很重要的收获,就是newtonsoft.json
这个工具。当然还有一点时减轻了我对无数密码的记忆负担。
以记录自己的学习历程
C#-用Winform制作一个简单的密码管理工具的更多相关文章
- [Winform]一个简单的账户管理工具
最近一直觉得注册的账户越来越多,帐号密码神马的容易弄混.自己就折腾了一个简单的账户管理工具,其实实现也挺简单,将每个账户的密码及相关密码提示信息,经aes算法加密之后保存到数据库,当前登录用户可以查询 ...
- WinForm 制作一个简单的计算器
namespace WindowsFormsApplication6 { public partial class Form1 : Form { //存储上次点击了什么按钮,0代表什么都没有点击,1代 ...
- 利用HTML制作一个简单的界面(工具HBuilder)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"><!--标题,里面填写 ...
- PureMVC和Unity3D的UGUI制作一个简单的员工管理系统实例
前言: 1.关于PureMVC: MVC框架在很多项目当中拥有广泛的应用,很多时候做项目前人开坑开了一半就消失了,后人为了填补各种的坑就遭殃的不得了.嘛,程序猿大家都不喜欢像文案策划一样组织文字写东西 ...
- 实例学习SSIS(一)--制作一个简单的ETL包
原文:实例学习SSIS(一)--制作一个简单的ETL包 导读: 实例学习SSIS(一)--制作一个简单的ETL包 实例学习SSIS(二)--使用迭代 实例学习SSIS(三)--使用包配置 实例学习SS ...
- TensorFlow练习13: 制作一个简单的聊天机器人
现在很多卖货公司都使用聊天机器人充当客服人员,许多科技巨头也纷纷推出各自的聊天助手,如苹果Siri.Google Now.Amazon Alexa.微软小冰等等.前不久有一个视频比较了Google N ...
- 手把手制作一个简单的IDEA插件(环境搭建Demo篇)
新建IDEA插件File --> new --> Project--> Intellij PlatForm Plugin-->Next-->填好项目名OK 编写插件新建工 ...
- 如何使用AEditor制作一个简单的H5交互页demo
转载自:http://www.alloyteam.com/2015/06/h5-jiao-hu-ye-bian-ji-qi-aeditor-jie-shao/ 本教程演示如何使用AEditor制作一个 ...
- 制作一个简单的WPF图片浏览器
原文:制作一个简单的WPF图片浏览器 注:本例选自MSDN样例,并略有改动.先看效果: 这里实现了以下几个功能:1. 对指定文件夹下所有JPG文件进行预览2. 对选定图片进行旋转3. 对选定图片 ...
随机推荐
- 当我谈 HTTP 时,我谈些什么?
当我们打开网站时也许不会去留意网站前面的HTTP是怎么来的.但是它毫无疑问在网络中有着举足轻重的地位.本文从起源到发展,详说HTTP从1到3的演变. 说在前面 本文不致力于讲完 HTTP 的全部内容, ...
- Web Scraping using Python Scrapy_BS4 - Software
Install the following software before web scraping. Visual Studio Code Python and Pip pip install vi ...
- P1039 侦探推理(洛谷)
昨天做了一个非常神奇的题,告诉我们做题之前一定要好好检测评测姬! 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先 ...
- TeamViewer如何绑定谷歌二次验证码/谷歌身份验证?
1.下载TeamViewer,找到谷歌二次验证界面 下载.注册TeamViewer后,点击右上角账户名-“编辑配置文件” [常规]-“双重验证”,点“启用” 进入[激活双重验证]界面,点“启动激活 ...
- 抓取Android崩溃日志
作为一个测试人员,特别是安卓的测试,由于系统版本的不同和手机本身各个品牌的优化和硬件的不同,会出现各种各样的崩溃. 记录崩溃的方式有很多种,比如使用录屏工具或文档进行记录,但是最简洁明了可以直接定位的 ...
- web自动化 -- HTMLreport(三)测试报告输出log日志
一.需求痛点 1.HTMLreport没法看到log日志,经过封装的框架不可能走一步就print() 2. 希望可以在HTMLreport中输出log日志 3.痛点截图 二.解决办法 1.既然是HTM ...
- 从零开始学Python网络爬虫PDF高清完整版免费下载|百度网盘
百度网盘:从零开始学Python网络爬虫PDF高清完整版免费下载 提取码:wy36 目录 前言第1章 Python零基础语法入门 11.1 Python与PyCharm安装 11.1.1 Python ...
- 0.9循环=lim(n趋于无穷大)(1-1/10的n次方),所以这是一个极限问题
0.9循环=lim(n趋于无穷大)(1-1/10的n次方),所以这是一个极限问题 因为lim(...)(1-1/10的n次方)=1 这意味着维尔斯特拉斯发明极限定义之前,这个等号是不成立的,因为没有极 ...
- form表单两种提交方式的不同
我们在使用<Form>表单的时候,最常用的提交方式就是Get和Post.我们都知道这两种方式最大的差别就是安全性,除此之外,它们还有哪些其他的区别,你知道吗? 在<Form& ...
- ls -bash: ls: command not found
ls -bash: ls: command not found原因:在设置环境变量时,编辑profile文件没有写正确,导致在命令行下 ls等命令不能够识别.解决方案: export PATH=/us ...