Я хочу протестировать флэш-приложение, работающее в браузере. Мне нужно перетащить кусочки в приложении. Я хочу сделать это, имитируя движения мыши с помощью Windows API.
Вот мое решение для имитации перетаскивания мышью:
void MoveMouse(LPINPUT input, int x, int y) {
input->type = INPUT_MOUSE;
input->mi.dx = x*(65536/GetSystemMetrics(SM_CXSCREEN));
input->mi.dy = y*(65536/GetSystemMetrics(SM_CYSCREEN));
input->mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
}
void LeftDownMouse(LPINPUT input, int x, int y) {
input->type = INPUT_MOUSE;
input->mi.dx = x*(65536/GetSystemMetrics(SM_CXSCREEN));
input->mi.dy = y*(65536/GetSystemMetrics(SM_CYSCREEN));
input->mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
}
void LeftUpMouse(LPINPUT input, int x, int y) {
input->type = INPUT_MOUSE;
input->mi.dx = x*(65536/GetSystemMetrics(SM_CXSCREEN));
input->mi.dy = y*(65536/GetSystemMetrics(SM_CYSCREEN));
input->mi.dwFlags = MOUSEEVENTF_LEFTUP;
}
void DragMouse(LPINPUT inputs, int startX, int startY, int dropX, int dropY) {
MoveMouse(&inputs[0], startX, startY);
LeftDownMouse(&inputs[1], startX, startY);
LeftUpMouse(&inputs[2], startX, startY);
LeftDownMouse(&inputs[3], startX, startY);
MoveMouse(&inputs[4], dropX, dropY);
LeftUpMouse(&inputs[5], dropX, dropY);
}
int _tmain(int argc, _TCHAR* argv[])
{
INPUT inputs [6] = {};
// Assume there is a maximized window, mouse drags the window from 40, 10 to 100,100 coordinates.
DragMouse(inputs, 40, 10, 100, 100);
SendInput(6, inputs, sizeof(INPUT));Sleep(1000);
return 0;
}
Этот код в основном не работает, иногда работает, имеет неопределенное поведение. В чем может быть проблема? Как я могу решить это?
У меня была похожая проблема с перетаскиванием, хотя мои результаты были постоянными в том, что мышь двигалась, но не перетаскиваемый элемент.
Ваш MoveMouse
функция отсутствует MOUSEEVENTF_LEFTDOWN
флаг. Пытаться input->mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE | MOUSEEVENTF_LEFTDOWN;
Без установки флага вы просто просите мышь двигаться без нажатия левой кнопки мыши.
редактировать
Я только что проверил свою реализацию, и я не устанавливаю координаты при нажатии или отпускании кнопок мыши. Только при переезде.
Что касается различий в результатах, вы можете остановить их, обнулив INPUT
перед настройкой полей.