首先是什麼原因讓我做這個小專案的呢,是因為在知乎裡看到的遊俠的文章才嘗試著自己做的,文章地址是: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 請說明是什麼原因。
感悟:任何簡單的事情看似簡單,實則對你來說是很難的,如果你不去嘗試動手,也許你永遠也不會做。反之,任何難的事情都是由簡單的事情積累而成的,所以不積跬步無以至千里。