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

Windows 模擬鼠標事件完整指南:SendInput API 詳細用法與坐標轉換

     編輯:更多程式設計知識

兩種 API 對比

API狀態建議
mouse_event已棄用(NT/2000/XP 後)僅兼容極舊系統
SendInput現代標準首選

關鍵結構:MOUSEINPUT

typedef struct tagMOUSEINPUT {
    LONG  dx;          // 絕對坐標或相對移動量
    LONG  dy;
    DWORD mouseData;   // 滾輪量(配合 MOUSEEVENTF_WHEEL)
    DWORD dwFlags;     // 動作標志
    DWORD time;        // 時間戳(0 表系統自動)
    ULONG_PTR dwExtraInfo;
} MOUSEINPUT;

坐標系統:絕對 vs 相對

  • 絕對模式(MOUSEEVENTF_ABSOLUTE):dx,dy 為 0~65535 映射全屏。需轉換:
    fx = x * (65535.0 / ScreenWidth)
    fy = y * (65535.0 / ScreenHeight)
  • 相對模式:dx,dy 為相對上次位置的像素偏移。

完整封裝函數庫

#include <windows.h>

// 左鍵點擊
void LeftClick() {
    INPUT input = {0};
    input.type = INPUT_MOUSE;
    input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
    SendInput(1, &input, sizeof(INPUT));
    input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
    SendInput(1, &input, sizeof(INPUT));
}

// 右鍵點擊
void RightClick() {
    INPUT input = {0};
    input.type = INPUT_MOUSE;
    input.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN;
    SendInput(1, &input, sizeof(INPUT));
    input.mi.dwFlags = MOUSEEVENTF_RIGHTUP;
    SendInput(1, &input, sizeof(INPUT));
}

// 移動到絕對坐標
void MouseMove(int x, int y) {
    double fx = x * (65535.0 / (GetSystemMetrics(SM_CXSCREEN) - 1));
    double fy = y * (65535.0 / (GetSystemMetrics(SM_CYSCREEN) - 1));
    INPUT input = {0};
    input.type = INPUT_MOUSE;
    input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE;
    input.mi.dx = (LONG)fx;
    input.mi.dy = (LONG)fy;
    SendInput(1, &input, sizeof(INPUT));
}

// 滾輪(正值向前/遠離用戶)
void MouseWheel(int delta) {
    INPUT input = {0};
    input.type = INPUT_MOUSE;
    input.mi.dwFlags = MOUSEEVENTF_WHEEL;
    input.mi.mouseData = delta; // WHEEL_DELTA = 120
    SendInput(1, &input, sizeof(INPUT));
}

常用標志位速查

標志含義
MOUSEEVENTF_MOVE移動
MOUSEEVENTF_LEFTDOWN/UP左鍵按下/抬起
MOUSEEVENTF_RIGHTDOWN/UP右鍵按下/抬起
MOUSEEVENTF_MIDDLEDOWN/UP中鍵按下/抬起
MOUSEEVENTF_WHEEL滾輪滾動
MOUSEEVENTF_ABSOLUTE絕對坐標模式

注意事項

  • 發送輸入需進程具有足夠權限(UIPI 限制)
  • 高 DPI 環境下坐標轉換需考慮縮放因子
  • 組合鍵(如 Ctrl+點擊)需同步發送鍵盤輸入
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved