Как автоматизировать перетаскивание с помощью SendInput

Я хочу протестировать флэш-приложение, работающее в браузере. Мне нужно перетащить кусочки в приложении. Я хочу сделать это, имитируя движения мыши с помощью 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;
}

Этот код в основном не работает, иногда работает, имеет неопределенное поведение. В чем может быть проблема? Как я могу решить это?

1

Решение

У меня была похожая проблема с перетаскиванием, хотя мои результаты были постоянными в том, что мышь двигалась, но не перетаскиваемый элемент.

Ваш MoveMouse функция отсутствует MOUSEEVENTF_LEFTDOWN флаг. Пытаться input->mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE | MOUSEEVENTF_LEFTDOWN;

Без установки флага вы просто просите мышь двигаться без нажатия левой кнопки мыши.

редактировать

Я только что проверил свою реализацию, и я не устанавливаю координаты при нажатии или отпускании кнопок мыши. Только при переезде.

Что касается различий в результатах, вы можете остановить их, обнулив INPUT перед настройкой полей.

0

Другие решения


По вопросам рекламы [email protected]