????????在軟件自動化測試或者重復性辦公任務中,鼠標操作的自動化可以大大減少人工干預,提高工作效率。這里將詳細介紹如何使用 C# 實現鼠標軌跡的錄制與回放功能,代碼結構清晰,具有較強的擴展性。
引用 NuGet 包
在開發這個功能時,我們需要用到第三方庫來實現全局鼠標鉤子監聽,推薦使用以下 NuGet 包:
- Gma.System.MouseKeyHook:用于監聽全局鼠標事件,捕獲鼠標移動和按鍵點擊。
- Newtonsoft.Json:用于將鼠標軌跡數據序列化成 JSON 格式進行保存和讀取。
在 NuGet 包管理器中運行以下命令進行安裝:
Install-Package Gma.System.MouseKeyHook
Install-Package Newtonsoft.Json
項目結構
整個項目的代碼結構如下:
EsClearTextEdit
├─ MouseRecorder.cs // 鼠標錄制類
├─ MousePlayer.cs // 鼠標回放類
└─ Form1.cs // WinForms 主窗體
代碼實現
1. 鼠標軌跡錄制類
MouseRecorder.cs
作用
MouseRecorder
類負責監聽鼠標事件,將鼠標的移動軌跡和點擊動作記錄下來,并按照時間間隔進行排序,最終保存成 JSON 文件。
代碼解釋
private List<MouseAction> actions = new List<MouseAction>();
這個列表用來存儲鼠標的操作軌跡。
private IKeyboardMouseEvents _hook;
IKeyboardMouseEvents
是來自 Gma.System.MouseKeyHook 庫的接口,提供全局事件監聽。
public void StartRecording()
{_hook = Hook.GlobalEvents();_hook.MouseDownExt += MouseDown;_hook.MouseMove += MouseMove;lastTime = DateTime.Now;
}
Hook.GlobalEvents()
:注冊全局鼠標監聽。MouseMove
事件監聽鼠標移動。MouseDownExt
事件監聽鼠標點擊。lastTime
用來計算鼠標操作之間的時間間隔。
private void MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{actions.Add(new MouseAction { X = e.X, Y = e.Y, Action = "Move", Time = (int)(DateTime.Now - lastTime).TotalMilliseconds });lastTime = DateTime.Now;
}
這個方法記錄鼠標移動的位置坐標 (X, Y)
以及動作名稱 Move,并計算當前動作與上一個動作之間的時間間隔。
private void MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{actions.Add(new MouseAction { X = e.X, Y = e.Y, Action = e.Button.ToString(), Time = (int)(DateTime.Now - lastTime).TotalMilliseconds });lastTime = DateTime.Now;
}
這個方法記錄鼠標點擊的位置坐標 (X, Y)
和按鍵類型(Left 或 Right)。
public void Save(string fileName)
{File.WriteAllText(fileName, Newtonsoft.Json.JsonConvert.SerializeObject(actions));
}
使用 Newtonsoft.Json 將錄制的軌跡序列化成 JSON 文件,方便保存和讀取。
public void StopRecording()
{_hook.MouseMove -= MouseMove;_hook.MouseDownExt -= MouseDown;_hook.Dispose();
}
停止監聽并釋放資源。
2. 鼠標軌跡回放類
MousePlayer.cs
作用
MousePlayer
類負責讀取保存的軌跡數據,并按照記錄的軌跡模擬鼠標操作。
代碼解釋
[DllImport("user32.dll")]
private static extern void SetCursorPos(int X, int Y);
通過 Windows API 設置鼠標光標的位置。
[DllImport("user32.dll")]
private static extern void mouse_event(uint dwFlags, int dx, int dy, uint dwData, IntPtr dwExtraInfo);
Windows API 發送鼠標事件。
public void Play(List<MouseAction> actions)
{foreach (var action in actions){Thread.Sleep(action.Time);SetCursorPos(action.X, action.Y);if (action.Action == "Left"){mouse_event(MOUSEEVENTF_LEFTDOWN, action.X, action.Y, 0, IntPtr.Zero);mouse_event(MOUSEEVENTF_LEFTUP, action.X, action.Y, 0, IntPtr.Zero);}}
}
遍歷錄制的軌跡數據,按時間間隔模擬鼠標移動和左鍵點擊。
3. 主窗體類
Form1.cs
代碼解釋
MouseRecorder recorder = new MouseRecorder();
MousePlayer player = new MousePlayer();
實例化錄制類和回放類。
private void uiButton1_Click(object sender, EventArgs e)
{recorder.StartRecording();MessageBox.Show("錄制開始!");
}
點擊 開始錄制 按鈕啟動鼠標軌跡錄制。
private void uiButton2_Click(object sender, EventArgs e)
{recorder.StopRecording();recorder.Save("track.json");MessageBox.Show("保存成功!");
}
停止錄制并保存軌跡。
private void uiButton3_Click(object sender, EventArgs e)
{var data = File.ReadAllText("track.json");var actions = Newtonsoft.Json.JsonConvert.DeserializeObject<List<MouseAction>>(data);player.Play(actions);
}
讀取 JSON 文件并回放軌跡。
private void uiButton3_Click(object sender, EventArgs e){var data = File.ReadAllText("track.json");var actions = Newtonsoft.Json.JsonConvert.DeserializeObject<List<MouseAction>>(data);player.Play(actions);}
源代碼:
????????MousePlayer類
????????
public class MousePlayer{[DllImport("user32.dll")]private static extern void SetCursorPos(int X, int Y);[DllImport("user32.dll")]private static extern void mouse_event(uint dwFlags, int dx, int dy, uint dwData, IntPtr dwExtraInfo);private const uint MOUSEEVENTF_LEFTDOWN = 0x02;private const uint MOUSEEVENTF_LEFTUP = 0x04;public void Play(List<MouseAction> actions){foreach (var action in actions){Thread.Sleep(action.Time);SetCursorPos(action.X, action.Y);if (action.Action == "Left"){mouse_event(MOUSEEVENTF_LEFTDOWN, action.X, action.Y, 0, IntPtr.Zero);mouse_event(MOUSEEVENTF_LEFTUP, action.X, action.Y, 0, IntPtr.Zero);}}}}
????????MouseRecorder類
????????
public class MouseRecorder{private List<MouseAction> actions = new List<MouseAction>();private IKeyboardMouseEvents _hook;private DateTime lastTime;public void StartRecording(){_hook = Hook.GlobalEvents();_hook.MouseDownExt += MouseDown;_hook.MouseMove += MouseMove;lastTime = DateTime.Now;}private void MouseMove(object sender, System.Windows.Forms.MouseEventArgs e){actions.Add(new MouseAction { X = e.X, Y = e.Y, Action = "Move", Time = (int)(DateTime.Now - lastTime).TotalMilliseconds });lastTime = DateTime.Now;}private void MouseDown(object sender, System.Windows.Forms.MouseEventArgs e){actions.Add(new MouseAction { X = e.X, Y = e.Y, Action = e.Button.ToString(), Time = (int)(DateTime.Now - lastTime).TotalMilliseconds });lastTime = DateTime.Now;}public void Save(string fileName){File.WriteAllText(fileName, Newtonsoft.Json.JsonConvert.SerializeObject(actions));}public void StopRecording(){_hook.MouseMove -= MouseMove;_hook.MouseDownExt -= MouseDown;_hook.Dispose();}}public class MouseAction{public int X { get; set; }public int Y { get; set; }public string Action { get; set; }public int Time { get; set; }}
????????主窗體代碼:
? ? ? ? ?
public partial class Form1 : Form{MouseRecorder recorder = new MouseRecorder();MousePlayer player = new MousePlayer();public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){}/// <summary>/// 開始錄制/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void uiButton1_Click(object sender, EventArgs e){recorder.StartRecording();}/// <summary>/// 停止/保存/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void uiButton2_Click(object sender, EventArgs e){recorder.StopRecording();recorder.Save("track.json");MessageBox.Show("保存成功!");}/// <summary>/// 讀取文件,并且進行自動操作/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void uiButton3_Click(object sender, EventArgs e){var data = File.ReadAllText("track.json");var actions = Newtonsoft.Json.JsonConvert.DeserializeObject<List<MouseAction>>(data);player.Play(actions);}}
使用場景
我們可以在以下場景中使用
- 軟件自動化測試:代替人工點擊執行測試任務。
- 辦公自動化:批量執行重復性任務。
- 游戲掛機腳本:重復執行游戲操作。
本代碼只實現了基礎功能,后續可以通過以下幾個方面進行擴展優化
- 支持右鍵點擊
- 鼠標滾輪操作
- 錄制暫停與恢復
- 自定義播放速度
通過本文的介紹,相信大家已經掌握了鼠標軌跡錄制與回放功能的實現方式。該功能在自動化測試和重復性工作中具有重要應用價值。后續可以進一步優化,增加更多擴展功能,形成一個完整的自動化工具。