首先是什么原因让我做这个小项目的呢,是因为在知乎里看到的游侠的文章才尝试着自己做的,文章地址是:https://www.zhihu.com/question/48811975
开始做的时候我是照着文章的界面去设计的,界面差不多是这样子:
然后具体说一说我遇到的问题吧,
首先是进程的问题:做这个小工具主要是为了关闭英雄联盟客户端,所以首先是怎么获取本机正在运行的进程,废话不多说,直接贴代码:
public void Process1(object sender, EventArgs e) { string name = "LeagueClient"; Process[] process = Process.GetProcesses(); for (int i = 0; i < process.Length; i++) { if (process[i].ProcessName == name) { process[i].Kill(); MessageBox.Show("已经关闭英雄联盟,请在规定时间内不要打开"); } } if (t.AutoReset == false) { MessageBox.Show("时间到,现在可以打开英雄联盟了,但是要适度玩游戏哦!"); } }
其实网上的例子大把,只需要搜索process 获取进程关键字就ok,这里我用的是局部变量传进程的名称
然后是我们要在一段时间内让进程不断的被杀,当我们点击button后,在一段时间内,英雄联盟不能启动,所以这里就要用到timer这个控件了
在button按钮里的代码如下:
public void button1_Click(object sender, EventArgs e) { tt.Start(); if (textBox1.Text == "") { MessageBox.Show("请输入要屏蔽的时间"); } else if (int.Parse(textBox1.Text) < 60) { MessageBox.Show("时间必须大于60"); } else { label1.Text = "00"; label7.Text = "00:00"; t.Elapsed += new System.Timers.ElapsedEventHandler(Process1);//到达时间自动执行Process1方法 t.AutoReset = true;//设置执行t.Elapsed += new System.Timers.ElapsedEventHandler(Process1);这个是执行一次(false)还是一直执行(true) t.Enabled = true;//启用elapsed事件(true),关闭elapsed事件(false) } }
再然后就是timer1_Tick事件了,在这个方法里,我开始是栽了很多的跟头的,首先遇到的问题是给label赋值问题,会报一个进程错误,然后这个错误有两种解决方法:
第一种是在这里加上CheckForIllegalCrossThreadCalls = false;这么一句,就不会出现上面的问题了,在有一种是比较高深的,我也只是明白了一点点:声明一个委托,然后invoke:
这个的意思就是异步调用,使用委托去执行你需要执行的方法,就是把方法当作一个参数传递,其他不多说了,自行百度
这里我要提醒我自己一下:论全局声明和局部声明的重要性。要知道这个问题可是耗费了我一个上午的时间。
这里再说下我们想要做到计时效果的话,就是实时显示时间,首先是需要设置一下timer的Interval的属性,单位是毫秒,不管是在代码中设置还是在属性里设置,这一步是实时显示时间的关键,个人建议设置为1秒刷新,到了这一步,基本的功能都完善了,再想想好像也没有了任何遇到的问题。
如果有想自己动手做碰到难题的朋友,欢迎随时交流切磋。
QQ:511582456 请说明是什么原因。
感悟:任何简单的事情看似简单,实则对你来说是很难的,如果你不去尝试动手,也许你永远也不会做。反之,任何难的事情都是由简单的事情积累而成的,所以不积跬步无以至千里。