問題代碼分析
// 原代碼問題:
// 1. 事件順序錯誤:先 UP 再 DOWN,導致無效點擊
// 2. 缺少雙擊間隔時間
// 3. 未激活目標窗口,點擊可能落在錯誤位置
正確 mouse_event 事件序列
MOUSEEVENTF_LEFTDOWN —— 按下左鍵
MOUSEEVENTF_LEFTUP —— 釋放左鍵(完成一次點擊)
Sleep(雙擊間隔) —— 系統雙擊速度閾值(通常 100-500ms)
- 重複 1-2 完成第二次點擊
完整可運行代碼(Win32 API)
#include <windows.h>
void main() {
// 1. 移動鼠標到目標位置(示例:屏幕坐標 200,10)
SetCursorPos(200, 10);
// 2. 關鍵:激活目標窗口(可选,視場景)
// HWND hwnd = FindWindow(NULL, L"目標窗口標題");
// SetForegroundWindow(hwnd);
// Sleep(500); // 等待窗口激活
// 3. 第一次單擊
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Sleep(500); // 間隔較長,確保系統識別為兩次單擊而非雙擊(測試用)
// 4. 正式雙擊(間隔極短,符合系統雙擊速度設置)
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Sleep(10); // 關鍵:雙擊間隔 ~10ms
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
system("pause");
}
關鍵注意點
- 坐標系統:
SetCursorPos 使用屏幕絕對坐標(0,0 為左上角)。
- 窗口激活:若目標程序非前台,必須先
SetForegroundWindow,否則點擊無效或落在別處。
- 雙擊速度:系統雙擊間隔閾值可在控制面板鼠標設置調整,代碼中
Sleep(10) 適配大多數默認設置。
- 權限:管理員權限運行的程序無法向非管理員窗口發送輸入(UIPI 限制),需同級權限或關閉 UAC。
現代替代方案
- SendInput:Win32 推薦替代
mouse_event,支持鍵盤/鼠標/硬件輸入合成,更可靠。
- Windows Automation API (UIA):針對 UI 元素直接操作,不依賴坐標,穩定性極高。
- AutoIt / Python (pyautogui/pywinauto):腳本語言快速實現自動化,適合測試腳本。