Робот не нажимает мышь во время движения мыши

В настоящее время я работаю над базовым программным обеспечением, которое может записывать ввод с клавиатуры и мыши, сохранять ввод в файл.txt и воспроизводить данные в файл. Я пересматриваю программу для добавления файлов и функциональности воспроизведения. У меня проблема с методом Robot.mousePress() в методе перемещения мыши:

public static void executeMouseMovementData() {

    mouseRobot.mousePress(InputEvent.BUTTON1_MASK);
    for (int i=0; i < MouseDataHandler.mouseData.size(); i++) {
        mouseRobot.moveMouse(MouseDataHandler.mouseData.get(i).getX(), MouseDataHandler.mouseData.get(i).getY());
        mouseRobot.delay(MouseDataHandler.mouseData.get(i).getTimeElapsed());
    }
    mouseRobot.releaseMouse();
}

Эта программа следует основной последовательности событий: 1 инициализация данных, 2 нажатие мыши, 3 перемещение мыши, 4 отпускание мыши. В отличие от другого метода, который я успешно реализовал, этот метод не нажимает кнопку мыши в любое время без видимой причины. Движение мыши прекрасно работает с функцией воспроизведения. Я просто не могу заставить Робота выполнить любое событие мыши, кроме движения, даже если я реструктурирую метод.

Я попытался отредактировать метод, чтобы убедиться, что робот не нажимает мышь во время нажатия кнопки "воспроизведение" в графическом интерфейсе, чтобы не мешать фокусировке события мыши. Вероятно, ошибка не связана с другими аспектами кода, потому что все остальное в программе работает без сбоев. Объект "mouseRobot" является базовым классом расширения класса Java.awt.Robot с базовым интерфейсом для сложных методов мыши Robot (), и я даже напрямую вызываю метод mousePress из класса Robot.

В чем может быть неисправность, возникающая в этом методе?


1 ответ

Решаемые. Улучшен метод, в котором обрабатываются движения мыши, чтобы сделать одно движение мыши на кадр. Класс теперь может точно выполнять различные проверки и изменения данных между движениями мыши, а также позволяет другим классам функционировать, не задерживаясь при длительном цикле for. Метод в вопросе был чрезвычайно неэффективным, непрактичным и в основном действовал как цикл "пока".

public void handleMouseMovements() {
    if (shouldAttemptToMoveMouse) {
        if (!targetHasBeenReached(currentAdjustedX, currentAdjustedY, targetX, targetY)) {
            if (!movementCreated) {
                calculateDirection(startX, startY, targetX, targetY);
                getLineIndexToUse();
                initializeMoveData(repositoryFileIndex, fileIndex);
                movementCreated = true;
                firstTime = System.currentTimeMillis();
            }
            if (CMMI >= Main.mouseDataHandler.getSizeOfRepositoryIndex(repositoryFileIndex, fileIndex)){
                CMMI =0;
                loopMovement();
            }
            if (movementfileIndexTimeHasElapsed(repositoryFileIndex, fileIndex)) {
                moveMouse(repositoryFileIndex, fileIndex);
                CMMI++;
                firstTime = System.currentTimeMillis();
            }
        }
        else {
            resetData();
        }
    }
}
public void moveMouse(int repositoryFileIndex, int fileIndex) {
    currentX = MouseDataHandler.mdr.get(repositoryFileIndex).get(fileIndex).get(CMMI).getX();
    currentY = MouseDataHandler.mdr.get(repositoryFileIndex).get(fileIndex).get(CMMI).getY();
    currentAdjustedX = currentX + distanceX;
    currentAdjustedY = currentY + distanceY;
    Main.bot.moveMouse(currentAdjustedX + Main.getX(), currentAdjustedY + Main.getY() + 25);
}

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

Другие вопросы по тегам