API 基礎
SetCursorPos(X, Y):將游標移至螢幕絕對座標。
mouse_event(dwFlags, dx, dy, dwData, dwExtraInfo):注入滑鼠事件。
MOUSEEVENTF_MOVE:相對移動(dx,dy 為相對量)。
MOUSEEVENTF_LEFTDOWN / LEFTUP:左鍵按下/釋放。
MOUSEEVENTF_RIGHTDOWN / RIGHTUP:右鍵按下/釋放。
MOUSEEVENTF_WHEEL:滾輪(dwData 為滾動量)。
MOUSEEVENTF_ABSOLUTE:配合 dx,dy 為 0~65535 正規化絕對座標。
四大基本操作封裝
procedure MouseMoveTo(X, Y: Integer);
begin
SetCursorPos(X, Y);
end;
procedure MouseLeftClick(X, Y: Integer);
begin
SetCursorPos(X, Y);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
end;
procedure MouseLeftDblClick(X, Y: Integer);
begin
MouseLeftClick(X, Y);
Sleep(50); // 間隔略大於系統雙擊速度設定
MouseLeftClick(X, Y);
end;
procedure MouseRightClick(X, Y: Integer);
begin
SetCursorPos(X, Y);
mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
end;
完整表單範例
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm)
btnMove, btnLClick, btnLDClick, btnRClick: TButton;
procedure btnMoveClick(Sender: TObject);
procedure btnLClickClick(Sender: TObject);
procedure btnLDClickClick(Sender: TObject);
procedure btnRClickClick(Sender: TObject);
end;
var Form1: TForm1;
implementation {$R *.dfm}
procedure TForm1.btnMoveClick(Sender: TObject);
begin mouse_event(MOUSEEVENTF_MOVE, 100, 100, 0, 0); end;
procedure TForm1.btnLClickClick(Sender: TObject);
begin MouseLeftClick(10, 10); end;
procedure TForm1.btnLDClickClick(Sender: TObject);
begin MouseLeftDblClick(200, 200); end;
procedure TForm1.btnRClickClick(Sender: TObject);
begin MouseRightClick(200, 200); end;
end.
執行畫面
應用場景與風險
| 場景 | 說明 |
| 遠端桌面/控制軟體 | 本端注入事件傳送至遠端重放 |
| 自動化測試 | 模擬使用者操作驗證 UI 流程 |
| 遊戲外掛/腳本 | 自動掛機、自動瞄準(違反使用條款,風險極高) |
| 惡意軟體 | 竊取點擊、繞過 UAC、駭客工具常用手法 |
防禦偵測
- 系統層:
WH_MOUSE_LL 低層鉤子監控注入事件(LLMHF_INJECTED 標誌)。
- 應用層:檢測
GetAsyncKeyState 與實體輸入不一致、統計點擊間隔分佈(機器操作過於規律)。
- UAC 安全桌面:提權提示畫面在隔離桌面,無法被普通進程
mouse_event 穿透。