首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 模擬鼠標操作:調用 Windows API 實現移動與點擊

     編輯:關於C語言

應用場景

  • 自動化測試腳本(重現用戶操作)
  • 演示軟體/教學 Demo(自動演示操作流程)
  • 宏錄製回放工具
  • 無障礙輔助工具

核心 API 簽名

1. 設置絕對座標位置

[DllImport("user32.dll")]
static extern bool SetCursorPos(int X, int Y);

參數 X, Y 為螢幕左上角為原點的絕對座標。

2. 綜合鼠標事件模擬

[DllImport("user32.dll")]
static extern void mouse_event(MouseEventFlag flags, int dx, int dy, uint data, UIntPtr extraInfo);

功能更強:支援相對/絕對座標、左/中/右鍵按下釋放、滾輪、X 按鈕等。

鼠標事件標志枚舉

[Flags]
enum MouseEventFlag : uint
{
    Move = 0x0001,        // 移動
    LeftDown = 0x0002,    // 左鍵按下
    LeftUp = 0x0004,      // 左鍵釋放
    RightDown = 0x0008,   // 右鍵按下
    RightUp = 0x0010,     // 右鍵釋放
    MiddleDown = 0x0020,  // 中鍵按下
    MiddleUp = 0x0040,    // 中鍵釋放
    XDown = 0x0080,       // X1 按下
    XUp = 0x0100,         // X1 釋放
    Wheel = 0x0800,       // 滾輪
    VirtualDesk = 0x4000, // 虛擬桌面
    Absolute = 0x8000     // 絕對座標
}

常用組合範例

左鍵單擊

// 絕對座標點擊
mouse_event(MouseEventFlag.Absolute | MouseEventFlag.LeftDown | MouseEventFlag.LeftUp, 
    x, y, 0, UIntPtr.Zero);

相對移動

// 相對當前位置移動 100, 50
mouse_event(MouseEventFlag.Move, 100, 50, 0, UIntPtr.Zero);

滾輪滾動

// 向前滾動 120 单位
mouse_event(MouseEventFlag.Wheel, 0, 0, 120, UIntPtr.Zero);

封裝建議:MouseSimulator 靜態類

public static class MouseSimulator
{
    [DllImport("user32.dll")] private static extern bool SetCursorPos(int x, int y);
    [DllImport("user32.dll")] private static extern void mouse_event(uint flags, int dx, int dy, uint data, UIntPtr extraInfo);
    
    private const uint MOUSEEVENTF_ABSOLUTE = 0x8000;
    private const uint MOUSEEVENTF_LEFTDOWN = 0x0002;
    private const uint MOUSEEVENTF_LEFTUP = 0x0004;
    private const uint MOUSEEVENTF_RIGHTDOWN = 0x0008;
    private const uint MOUSEEVENTF_RIGHTUP = 0x0010;
    private const uint MOUSEEVENTF_MOVE = 0x0001;
    private const uint MOUSEEVENTF_WHEEL = 0x0800;

    public static void MoveTo(int x, int y) => SetCursorPos(x, y);
    
    public static void LeftClick(int x, int y)
    {
        SetCursorPos(x, y);
        mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, x, y, 0, UIntPtr.Zero);
    }
    
    public static void RightClick(int x, int y)
    {
        SetCursorPos(x, y);
        mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, x, y, 0, UIntPtr.Zero);
    }
    
    public static void Scroll(int delta) => mouse_event(MOUSEEVENTF_WHEEL, 0, 0, (uint)delta, UIntPtr.Zero);
}

注意事項

  • 權限:目標視窗需具備接收輸入權限,UAC 高完整性進程可能阻攔
  • 座標系:多螢幕環境下座標為虛擬螢幕座標,需注意主螢幕偏移
  • 時序:按下與釋放間建議加微小延遲(Thread.Sleep(10)),模擬真實人類操作
  • 替代方案:UI Automation、Selenium、Playwright 等現代自動化框架更穩定、跨平台
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved