今天整理電腦,看到這個小工具源碼,曾經是為了天貓點紅包而寫的。若是像今天這樣差點刪掉了多少有點可惜,雖然沒有技術含量,還是決定整理一下分享出來,為開源出一份綿薄之力。
1、工具界面介紹與項目文件介紹
小工具界面如下圖,需要說明有兩點:
1、延時是指當前操作后,休息多長時間執行下一個動作,不是多長時間后執行本動作。
2、Ctrl+S保存文件,必須保證當前焦點在左欄上(鼠標點擊一下左欄即可)。
項目文件如下,其中要說明的是MouseKeyboardActivityMonitor是一個C#實現的鼠標鍵盤勾子項目(項目地址:https://globalmousekeyhook.codeplex.com/),我本人對windows編程不太了解,勾子的含義與用處我也是網上查了查,半知半解!此處我主要是為了實現幾個全局的熱鍵(F7、F8、F9)而引入的這個項目。
2、開發過程簡單介紹
首先是拖出工具的界面,這個不說了。然后在界面加載后,需要注冊一下鼠標鍵盤勾子(為了在鼠標鍵盤發生事件時,我能做一些事情)。以下代碼在Form1的構造方法中:
//設置鼠標勾子 mhl = new MouseHookListener(new MouseKeyboardActivityMonitor.WinApi.GlobalHooker()); mhl.MouseMove += new MouseEventHandler(mhl_MouseMove); mhl.Enabled = true; //設置鍵盤勾子 khl = new KeyboardHookListener(new MouseKeyboardActivityMonitor.WinApi.GlobalHooker()); khl.KeyDown += new KeyEventHandler(khl_KeyDown); khl.Enabled = true;
可以看到我利用勾子來向系統注冊了兩個事件,一個是當鼠標移動時發生的事件,對應的事件處理邏輯就是將鼠標坐標顯示到界面上;另一個是鍵盤有按鍵按下時發生的事件,事件處理邏輯是:按F7時,我紀錄下當前的坐標信息與操作信息(鼠標:左/右單擊、左/右雙擊,延時等);按F8時,交給工作線程去執行紀錄下的鼠標命令;按F9時,停止執行。代碼如下:
//界面上實時顯示鼠標坐標 void mhl_MouseMove(object sender, MouseEventArgs e) { txtX.Text = e.X.ToString(); txtY.Text = e.Y.ToString(); } //判斷按鍵 void khl_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.F7) //F7 設置坐標點 { string action = string.Empty; if (rbtnLeftClick.Checked) action = rbtnLeftClick.Text; //左單擊 else if (rbtnLeftDoubleClick.Checked) action = rbtnLeftDoubleClick.Text; //左雙擊 else if (rbtnRightClick.Checked) action = rbtnRightClick.Text; //右單擊 else if (rbtnRightDoubleClick.Checked) action = rbtnRightDoubleClick.Text; //右雙擊 listBox1.Items.Add(string.Format("{0}|{1}|{2}|{3}", txtX.Text, txtY.Text, action, txtSleep.Text.Trim())); } else if (e.KeyCode == Keys.F8) //F8 開始 { if (listBox1.Items.Count == 0) return; AutoClickThread.ClickData = listBox1.Items.Cast<string>().ToList(); AutoClickThread.Start(IsRecycleRun.Checked); } else if (e.KeyCode == Keys.F9) //F9 停止 { AutoClickThread.Stop(); } }
另外在操作上為了不必每次都設置一遍鼠標命令,添加了讀寫配置到文本文件的功能。當焦點在左欄上時,Ctrl+S(這里可能要時間按長一點點)可保存配置,雙擊左欄可選擇並打開一個配置。
鼠標自動點擊命令的執行線程,依次加載執行配置好的鼠標命令,代碼如下:
//執行 static void Run(object isRecycleRun) { string[] stringArray; int x, y, sleepTime; do { foreach (string item in ClickData) { if (cts.Token.IsCancellationRequested) return; stringArray = item.Split('|'); x = int.Parse(stringArray[0]); y = int.Parse(stringArray[1]); sleepTime = int.Parse(stringArray[3]); switch (stringArray[2]) { case "左單擊": MouseHelper.LeftButtonClick(x, y); break; case "左雙擊": MouseHelper.LeftButtonDoubleClick(x, y); break; case "右單擊": MouseHelper.RightButtonClick(x, y); break; case "右雙擊": MouseHelper.RightButtonDoubleClick(x, y); break; } Thread.Sleep(sleepTime); } } while ((bool)isRecycleRun); }
其中MouseHelper是對windows api 中鼠標消息進行了簡單的封裝,可用來模擬鼠標的單雙擊。
3、總結與源碼
本人技術水平與表達能力有限,博文或技術上的不足之處還請大家指出!