GST.Rpa.Recorder — 錄製模式
適用對象:GST 內部開發人員 前置知識:C# / .NET 8 / Windows UI Automation 閱讀時間:10 分鐘 最後更新:2026-04-04 版本:0.1.0
本模組目前為骨架階段,僅包含 DI 註冊介面。以下標註「Planned」的章節描述規劃中的架構設計。
1. 模組職責
GST.Rpa.Recorder 負責錄製使用者的 UI 操作,並自動產生對應的 C# 腳本。其核心流程為:
- 攔截使用者的滑鼠點擊、鍵盤輸入等 UI 事件
- 透過 UI Automation 識別目標控制項的屬性(AutomationId、ClassName、Name 等)
- 將事件序列轉換為可執行的 C# 腳本程式碼
- 對產生的腳本進行最佳化(合併重複動作、移除冗餘等待)
此模組依賴 GST.Rpa.Automation 提供的 UI 元素定位能力,以及 GST.Rpa.Core 的基礎型別定義。
2. NuGet 引用與相依
Target Framework:net8.0-windows(繼承自 Directory.Build.props)
專案參考
| 相依專案 | 用途 |
|---|---|
GST.Rpa.Core | 核心型別、介面定義 |
GST.Rpa.Automation | UI Automation 元素定位與操作 |
NuGet 套件
| 套件 | 用途 |
|---|---|
Microsoft.Extensions.DependencyInjection | DI 容器註冊 |
完整 .csproj 內容:
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<ProjectReference Include="..\GST.Rpa.Core\GST.Rpa.Core.csproj" />
<ProjectReference Include="..\GST.Rpa.Automation\GST.Rpa.Automation.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" />
</ItemGroup>
</Project>
3. 現有介面
目前模組僅包含一個檔案 — DI 擴充方法,提供 AddRpaRecorder() 作為未來服務註冊的進入點。
ServiceCollectionExtensions
using Microsoft.Extensions.DependencyInjection;
namespace GST.Rpa.Recorder;
public static class ServiceCollectionExtensions
{
public static IServiceCollection AddRpaRecorder(this IServiceCollection services)
{
// TODO (GST-350): Register UI event recorder services
return services;
}
}
使用方式(在應用程式啟動時):
services.AddRpaRecorder();
目前此方法為空實作,待後續開發階段逐步註冊錄製相關服務。
4. 規劃架構
4.0 錄製時序總覽(Planned)
下圖呈現規劃中的完整錄製流程:使用者操作經 Win32 Hook 與 UIA Event Handler 雙管道捕捉 → Recorder 關聯成 RecordedEvent → 透過 IObservable<RecordedEvent> 串流推送 → 停止錄製後產生 C# 腳本。
時序的兩個關鍵設計:
- 雙管道捕捉:Win32 Hook 拿到「使用者實際做了什麼」(座標、鍵碼),UIA Event 拿到「對應的 UI 元素是誰」(AutomationId、ControlType);Recorder 在收到事件時把兩者關聯起來,產出帶有元素資訊的
RecordedEvent - 串流 + 批次後處理:錄製過程使用
IObservable<RecordedEvent>即時推送(UI 可邊錄邊顯示),但腳本產生與最佳化是StopRecordingAsync後一次性執行,便於做跨事件的 pattern 偵測(例如連續輸入合併為單一TypeText)
4.1 IRpaRecorder 介面設計
規劃中的核心介面,定義錄製模式的生命週期:
public interface IRpaRecorder
{
Task StartRecordingAsync(RecordingOptions options, CancellationToken ct = default);
Task StopRecordingAsync(CancellationToken ct = default);
Task PauseRecordingAsync();
Task ResumeRecordingAsync();
IObservable<RecordedEvent> Events { get; }
RecordingState State { get; }
}
StartRecordingAsync— 開始攔截 UI 事件StopRecordingAsync— 停止錄製並輸出事件序列Events— 以 Reactive 串流即時推送錄製到的事件State— 目前錄製狀態(Idle / Recording / Paused)
4.2 UIAutomation Event Handler 機制
透過 System.Windows.Automation 的事件訂閱機制,監聽目標應用程式的 UI 變化:
- StructureChangedEvent — 偵測視窗開關、控制項新增/移除
- FocusChangedEvent — 追蹤焦點切換
- PropertyChangedEvent — 監控控制項屬性變更(如 Value、Selection)
- InvokePattern — 捕捉按鈕點擊等叫用動作
預計整合 GST.Rpa.Automation 已封裝的 UIA Wrapper,避免直接操作低階 COM 介面。
4.3 Win32 Hook(Mouse / Keyboard)
UIAutomation 事件無法涵蓋所有操作(例如拖曳、快捷鍵組合),因此需搭配 Win32 低階 Hook:
| Hook 類型 | Win32 常數 | 用途 |
|---|---|---|
| 滑鼠 Hook | WH_MOUSE_LL | 捕捉點擊座標、滾輪、拖曳 |
| 鍵盤 Hook | WH_KEYBOARD_LL | 捕捉按鍵序列、快捷鍵組合 |
Hook 回傳的原始事件會與 UIAutomation 的元素資訊做關聯,產生完整的 RecordedEvent。
4.4 Event → Script 轉換演算法
將錄製的事件序列轉換為 C# 腳本的流程:
- Event Normalization — 統一事件格式,補充元素定位資訊
- Element Locator Resolution — 為每個 UI 元素選擇最穩定的定位策略(AutomationId 優先,備援 XPath)
- Action Mapping — 將原始事件對應到
GST.Rpa.Automation的高階 API 呼叫 - Code Generation — 使用 Roslyn 或 Template 產生可編譯的 C# 程式碼
產生的腳本預計符合 GST.Rpa.Scripting 的腳本格式規範。
4.5 Script 最佳化策略
錄製產生的原始腳本通常包含冗餘操作,需進行最佳化:
| 策略 | 說明 |
|---|---|
| 動作合併 | 連續的字元輸入合併為單一 TypeText() 呼叫 |
| 等待最佳化 | 以智慧等待(WaitForElement)取代固定延遲 |
| 重複偵測 | 辨識重複的操作模式,提取為迴圈或子程序 |
| 冗餘移除 | 移除無效的 Focus 切換、多餘的滑鼠移動事件 |
| 定位器簡化 | 優先使用 AutomationId,減少脆弱的座標定位 |
5. 版本紀錄
| 版本 | 日期 | 說明 |
|---|---|---|
| 0.1.0 | 2026-04-04 | 骨架初版 — 僅包含 DI 註冊擴充方法 |