自己動(dòng)手寫工具----簽到器(升級(jí)版)
一、前面的話
上一篇中基本實(shí)現(xiàn)了簡單的簽到任務(wù),但是不夠靈活。在上一篇自己動(dòng)手寫工具----簽到器的結(jié)尾中,我設(shè)想了幾個(gè)新增功能來提高工具的靈活程度,下面把新增功能點(diǎn)列出來看看:
(1)新增其他的進(jìn)程任務(wù);
(2)任務(wù)按照進(jìn)程進(jìn)行分類:用IE就是執(zhí)行IE的任務(wù),與其他(如資源管理器等)無關(guān);
(3)每執(zhí)行完一個(gè)任務(wù)關(guān)閉任務(wù)窗口;
(4)對(duì)簽到性質(zhì)的任務(wù)進(jìn)行”已簽到“過濾;
(5)實(shí)現(xiàn)執(zhí)行的任務(wù)列表自定義;
(6)另外實(shí)現(xiàn)任務(wù)的可視化;
還是先來看看效果圖:

二、簽到器的改進(jìn)
在上一個(gè)版本中,(自己動(dòng)手寫工具----簽到器),我們可以自己來添加任務(wù),但是有個(gè)最重要的問題,那就是任務(wù)列表的可視化。上一版本中,只是針對(duì)簡單的幾個(gè)IE任務(wù),所以比較簡單,但是隨著任務(wù)越來越多,有的時(shí)候只想執(zhí)行其中的一些任務(wù)而不是所有,這就不可避免地要對(duì)任務(wù)進(jìn)行分類處理,這樣就可以針對(duì)自己選擇的任務(wù)進(jìn)行批量執(zhí)行。就是上面圖中左側(cè)的部分啦~~通過勾選需要執(zhí)行的任務(wù),點(diǎn)擊“確定”按鈕,你就可以看著任務(wù)被一個(gè)一個(gè)地執(zhí)行啦~\(≧▽≦)/~
在執(zhí)行的過程中,如果任務(wù)過多就會(huì)占用過多的資源(如開啟多個(gè)IE瀏覽器進(jìn)程,上一個(gè)版本就是醬紫的... ...),為了解決這個(gè)問題,對(duì)代碼進(jìn)行小小的優(yōu)化,每次執(zhí)行完成一個(gè)任務(wù),就會(huì)關(guān)閉該進(jìn)程,但是這里有個(gè)疑問,希望大神幫忙支支招兒,感激不盡啊~~~~
什么問題呢?就是如果執(zhí)行任務(wù)之前,你已經(jīng)打開了一個(gè)IE進(jìn)程,那么在啟動(dòng)執(zhí)行任務(wù)后,隨著該任務(wù)進(jìn)程的關(guān)閉會(huì)連同之前的IE進(jìn)程Kill掉,所以這是個(gè)BUG,查了一下資料,大概的意思是獲取進(jìn)程的某個(gè)句柄后關(guān)閉即可,本人還沒有測試,希望大神給指個(gè)明路~~
下面是為了避免占用過多的系統(tǒng)資源,而進(jìn)行改進(jìn)后的執(zhí)行代碼:
- //關(guān)閉進(jìn)程
 - private void KillProcess(string processName)
 - {
 - Process proc = new Process();
 - foreach (Process item in Process.GetProcessesByName(processName))
 - {
 - if (!item.CloseMainWindow())
 - {
 - item.Kill();
 - }
 - }
 - }
 
- //執(zhí)行任務(wù)
 - public void ExcuteTask(TaskModel task)
 - {
 - int processID;
 - ProcessStartInfo ps = new ProcessStartInfo(task.Application, task.Url);
 - ps.WindowStyle = ProcessWindowStyle.Maximized;
 - Process myProc =Process.Start(ps);
 - processID = myProc.Id;
 - Thread.Sleep((int)numericUpDown2.Value * BASENUM);
 - //設(shè)置鼠標(biāo)位置
 - MouseEvents.SetCursorPosition(task.PositionX, task.PositionY);
 - //模擬鼠標(biāo)雙擊
 - MouseEvents.MouseDbClick();
 - Thread.Sleep(1000);
 - KillProcess(task.Application);
 - }
 
既然添加了任務(wù)分類信息,那么數(shù)據(jù)的結(jié)構(gòu)就要發(fā)生變化了,每個(gè)任務(wù)多了一個(gè)屬性,就是所屬分類:
- private string typeName;
 - private int typeID;
 - //任務(wù)分類名稱
 - public string TypeName
 - {
 - get { return typeName; }
 - set { typeName = value; }
 - }
 - //任務(wù)ID
 - public int TypeID
 - {
 - get { return typeID; }
 - set { typeID = value; }
 - }
 
數(shù)據(jù)結(jié)構(gòu):
- <?xml version="1.0" encoding="utf-8"?>
 - <tasks>
 - <task>
 - <taskType>
 - <taskTypeName>Internet Explore</taskTypeName>
 - </taskType>
 - <taskName>百度知道</taskName>
 - <application>iexplore.exe</application>
 - <param>http://zhidao.baidu.com/</param>
 - <position>
 - <x>1223</x>
 - <y>298</y>
 - </position>
 - </task>
 - <task>
 - <taskType>
 - <taskTypeName>Internet Explore</taskTypeName>
 - </taskType>
 - <taskName>百度云盤</taskName>
 - <application>iexplore.exe</application>
 - <param>http://www.baiduyun.me/forum.php</param>
 - <position>
 - <x>1561</x>
 - <y>144</y>
 - </position>
 - </task>
 - </tasks>
 
還有一個(gè)地方想說一下,就是左側(cè)的任務(wù)列表,本來打算用ListView實(shí)現(xiàn),但是效果我不是很滿意,所以就改成了現(xiàn)在的樣子。至于標(biāo)簽,那只不過是自定義的控件,我對(duì)重寫控件很感興趣,本著學(xué)習(xí)和記錄的目的,打算把這一塊記錄下來(貌似有點(diǎn)跑題呀~)。在擼碼的時(shí)候,發(fā)現(xiàn)Label控件的大小不是很好控制,其實(shí)我的需求是Label既包含了AutoSize屬性,還能夠給checkbox留下一點(diǎn)空間,就是說checkbox的位置始終緊貼在Label的右內(nèi)側(cè),文字長度改變時(shí),整個(gè)控件長度也發(fā)生變化,但是checkbox的相對(duì)位置是不變的~~結(jié)果糾結(jié)了,哎... ...無奈只能用固定的長度了,四個(gè)漢字的長度,如果有大神知道怎么搞定這個(gè)需求,望不吝賜教~~下面貼出自定義控件代碼(大神繞道...)
新建用戶控件,并重寫控件的OnPaint方法:
- protected override void OnPaint(PaintEventArgs e)
 - {
 - Graphics g = e.Graphics;
 - int x = this.Width;
 - int y = this.Height;
 - Point leftTop = new Point(0, 0);
 - Point rightTop = new Point(x - 1, 0);
 - Point leftBottom = new Point(0, y - 1);
 - Point rightBottom = new Point(x - 1, y - 1);
 - g.DrawLine(new Pen(Color.White), leftTop, rightTop);
 - g.DrawLine(new Pen(Color.White), leftBottom, rightBottom);
 - g.DrawLine(new Pen(Color.White), leftTop, leftBottom);
 - g.DrawLine(new Pen(Color.White), rightTop, rightBottom);
 - //畫上邊緣
 - for (int i = 0; i < x - 1; i += 3)
 - {
 - g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(i, 0, 2, 1));
 - }
 - //畫下邊緣
 - for (int m = 0; m < x - 1; m += 3)
 - {
 - g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(m, y - 1, 2, 1));
 - }
 - //畫左邊緣
 - for (int i = 0; i < y - 1; i += 3)
 - {
 - g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(0, i, 1, 2));
 - }
 - //畫右邊緣
 - for (int i = 0; i < y - 1; i += 3)
 - {
 - g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(x - 1, i, 1, 2));
 - }
 - base.OnPaint(e);
 - }
 
再給組合控件添加一些屬性,給外部調(diào)用:
- private bool labelChecked = false;
 - private string labelText;
 - public bool LabelChecked
 - {
 - get
 - {
 - return ck.Checked;
 - }
 - set
 - {
 - ck.Checked = value;
 - }
 - }
 - public string LabelText
 - {
 - get
 - {
 - if(!String.IsNullOrEmpty(lb.Text))
 - return lb.Text;
 - return "輸入標(biāo)簽";
 - }
 - set
 - {
 - lb.Text = value;
 - }
 - }
 
那么這個(gè)組合控件就完成了,生成后可以在右側(cè)屬性欄為其賦值,直接使用就可以啦~~~
三、結(jié)語
本來想在上一篇完成后緊接著更新這一篇,但是時(shí)間有限,事情也很多,所以就推遲到現(xiàn)在才完成(其實(shí)還沒有完成,最上面劃刪除線的啷個(gè)~~)。不得不承認(rèn),在做的過程中總會(huì)遇見這樣那樣或多或少的問題,有些問題看起來很簡單,但是做起來是有些困難的,克服了這些困難也就成功了,也就有經(jīng)驗(yàn)來處理類似的問題了,所以別問那些大牛是怎么那么牛的~~那是碼出來的。所以,騷年,敲代碼吧~~讓困難來得更猛烈些吧~~~~~
下一步我準(zhǔn)備繼續(xù)完善這個(gè)簽到器(其實(shí)功能擴(kuò)展多了,就不叫這個(gè)名字了... ...)。另外,有些園友想要源碼,我會(huì)盡快整理好發(fā)布到Github上~~多謝大家的支持?。?!
如果覺得好玩兒,就幫贊一個(gè)唄~\(≧▽≦)/~















 
 
 



 
 
 
 