【原創】本身動手寫工具----簽到器[Beta 2.0]

前面的話

上一篇中基本實現了簡單的簽到任務,可是不夠靈活。在上一篇本身動手寫工具----簽到器的結尾中,我設想了幾個新增功能來提升工具的靈活程度,下面把新增功能點列出來看看:php

(1)新增其餘的進程任務;html

(2)任務按照進程進行分類:用IE就是執行IE的任務,與其餘(如資源管理器等)無關;git

(3)每執行完一個任務關閉任務窗口;github

(4)對簽到性質的任務進行」已簽到「過濾;瀏覽器

(5)實現執行的任務列表自定義;數據結構

(6)另外實現任務的可視化;app

仍是先來看看效果圖:ide

簽到器的改進

在上一個版本中,(本身動手寫工具----簽到器),咱們能夠本身來添加任務,可是有個最重要的問題,那就是任務列表的可視化。上一版本中,只是針對簡單的幾個IE任務,因此比較簡單,可是隨着任務愈來愈多,有的時候只想執行其中的一些任務而不是全部,這就不可避免地要對任務進行分類處理,這樣就能夠針對本身選擇的任務進行批量執行。就是上面圖中左側的部分啦~~經過勾選須要執行的任務,點擊「肯定」按鈕,你就能夠看着任務被一個一個地執行啦~\(≧▽≦)/~工具

在執行的過程當中,若是任務過多就會佔用過多的資源(如開啓多個IE瀏覽器進程,上一個版本就是醬紫的... ...),爲了解決這個問題,對代碼進行小小的優化,每次執行完成一個任務,就會關閉該進程,可是這裏有個疑問,但願大神幫忙支支招兒,感激涕零啊~~~~
什麼問題呢?就是若是執行任務以前,你已經打開了一個IE進程,那麼在啓動執行任務後,隨着該任務進程的關閉會連同以前的IE進程Kill掉,因此這是個BUG,查了一下資料,大概的意思是獲取進程的某個句柄後關閉便可,本人尚未測試,但願大神給指個明路~~學習

下面是爲了不佔用過多的系統資源,而進行改進後的執行代碼:

 1 //關閉進程
 2  private void KillProcess(string processName)
 3  {
 4      Process proc = new Process();
 5      foreach (Process item in Process.GetProcessesByName(processName))
 6      {
 7          if (!item.CloseMainWindow())
 8          {
 9              item.Kill();
10          }
11      }
12  }
 1  //執行任務
 2  public void ExcuteTask(TaskModel task)
 3  {
 4      int processID;
 5      ProcessStartInfo ps = new ProcessStartInfo(task.Application, task.Url);
 6      ps.WindowStyle = ProcessWindowStyle.Maximized;
 7      Process myProc =Process.Start(ps);
 8      processID = myProc.Id;
 9      Thread.Sleep((int)numericUpDown2.Value * BASENUM);
10      //設置鼠標位置
11      MouseEvents.SetCursorPosition(task.PositionX, task.PositionY);
12      //模擬鼠標雙擊
13      MouseEvents.MouseDbClick();
14      Thread.Sleep(1000);
15      KillProcess(task.Application);
16  }

既然添加了任務分類信息,那麼數據的結構就要發生變化了,每一個任務多了一個屬性,就是所屬分類:

 1  private string typeName;
 2  private int typeID;
 3  //任務分類名稱
 4  public string TypeName
 5  {
 6      get { return typeName; }
 7      set { typeName = value; }
 8  }
 9 
10  //任務ID
11  public int TypeID
12  {
13      get { return typeID; }
14      set { typeID = value; }
15  }

數據結構:

<?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>

還有一個地方想說一下,就是左側的任務列表,原本打算用ListView實現,可是效果我不是很滿意,因此就改爲了如今的樣子。至於標籤,那隻不過是自定義的控件,我對重寫控件很感興趣,本着學習和記錄的目的,打算把這一塊記錄下來(貌似有點跑題呀~)。在擼碼的時候,發現Label控件的大小不是很好控制,其實個人需求是Label既包含了AutoSize屬性,還可以給checkbox留下一點空間,就是說checkbox的位置始終緊貼在Label的右內側,文字長度改變時,整個控件長度也發生變化,可是checkbox的相對位置是不變的~~結果糾結了,哎... ...無奈只能用固定的長度了,四個漢字的長度,若是有大神知道怎麼搞定這個需求,望不吝賜教~~下面貼出自定義控件代碼(大神繞道...)

新建用戶控件,並重寫控件的OnPaint方法:

 1 protected override void OnPaint(PaintEventArgs e)
 2 {
 3      Graphics g = e.Graphics;
 4      int x = this.Width;
 5      int y = this.Height;
 6      Point leftTop = new Point(0, 0);
 7      Point rightTop = new Point(x - 1, 0);
 8      Point leftBottom = new Point(0, y - 1);
 9      Point rightBottom = new Point(x - 1, y - 1);
10 
11      g.DrawLine(new Pen(Color.White), leftTop, rightTop);
12      g.DrawLine(new Pen(Color.White), leftBottom, rightBottom);
13      g.DrawLine(new Pen(Color.White), leftTop, leftBottom);
14      g.DrawLine(new Pen(Color.White), rightTop, rightBottom);
15      //畫上邊緣
16      for (int i = 0; i < x - 1; i += 3)
17      {
18          g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(i, 0, 2, 1));
19      }
20 
21      //畫下邊緣
22      for (int m = 0; m < x - 1; m += 3)
23      {
24          g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(m, y - 1, 2, 1));
25      }
26 
27      //畫左邊緣
28      for (int i = 0; i < y - 1; i += 3)
29      {
30          g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(0, i, 1, 2));
31      }
32 
33      //畫右邊緣
34      for (int i = 0; i < y - 1; i += 3)
35      {
36          g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(x - 1, i, 1, 2));
37      }
38      base.OnPaint(e);
39 }

再給組合控件添加一些屬性,給外部調用:

 1 private bool labelChecked = false;
 2 private string labelText;
 3 public bool LabelChecked
 4 {
 5     get
 6     {
 7         return ck.Checked;
 8     }
 9     set
10     {
11         ck.Checked = value;
12     }
13 }
14 
15 public string LabelText
16 {
17     get
18     {
19         if(!String.IsNullOrEmpty(lb.Text))
20             return lb.Text;
21         return "輸入標籤";
22     }
23     set
24     {
25         lb.Text = value;
26     }
27 }

那麼這個組合控件就完成了,生成後能夠在右側屬性欄爲其賦值,直接使用就能夠啦~~~

結語

原本想在上一篇完成後緊接着更新這一篇,可是時間有限,事情也不少,因此就推遲到如今才完成(其實尚未完成,最上面劃刪除線的啷個~~)。不得不認可,在作的過程當中總會碰見這樣那樣或多或少的問題,有些問題看起來很簡單,可是作起來是有些困難的,克服了這些困難也就成功了,也就有經驗來處理相似的問題了,因此別問那些大牛是怎麼那麼牛的~~那是碼出來的。因此,騷年,敲代碼吧~~讓困難來得更猛烈些吧~~~~~

下一步我準備繼續完善這個簽到器(其實功能擴展多了,就不叫這個名字了... ...)。另外,有些園友想要源碼,我會盡快整理好發佈到Github上~~多謝你們的支持!!!

若是以爲好玩兒,就幫贊一個唄~\(≧▽≦)/~

  補充GitHub地址:請點我

 做者:悠揚的牧笛

 博客地址:http://www.cnblogs.com/xhb-bky-blog/p/4116148.html

 聲明:本博客原創文字只表明本人工做中在某一時間內總結的觀點或結論,與本人所在單位沒有直接利益關係。非商業,未受權貼子請以現狀保留,轉載時必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。

相關文章
相關標籤/搜索