0

我目前正在开发一个基本的实用软件,它能够记录键盘和鼠标输入,将输入保存到 .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 释放鼠标。与我成功实现的另一种方法不同,这种方法在任何时候都不会无缘无故地按下鼠标。鼠标移动与播放功能完美配合。我似乎无法让机器人执行除移动之外的任何类型的鼠标事件,即使我重组了方法。

我尝试编辑该方法以确保机器人在按下 GUI 上的“播放”按钮时不按下鼠标,以免弄乱鼠标事件的焦点。该错误可能与代码的其他方面无关,因为程序中的其他所有内容都运行顺利。对象“mouseRobot”是Java.awt.Robot 类的基本扩展类,具有复合Robot mouse methods() 的基本接口,我什至直接从Robot 类调用mousePress 方法。

这种方法可能会出现什么故障?


4

1 回答 1

0

解决了。改进了处理鼠标移动以每帧进行一次鼠标移动的方法。该类现在可以在鼠标移动之间准确地执行各种检查和数据更改,同时还允许其他类运行而不会因冗长的 for 循环而受阻。问题中的方法效率极低,不切实际,基本上充当了“while”循环。

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);
}

这种方法效率更高,并且可以处理确定方向、确定要使用的鼠标数据的文件索引、计算目标文件索引偏移量以及在鼠标移动之间具有适当的时间间隔所需的所有标准。

于 2018-05-23T07:33:43.077 回答