兩種 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+點擊)需同步發送鍵盤輸入