机器人在鼠标移动方法期间不按鼠标

时间:2018-05-19 06:36:09

标签: mousepress

我目前正在开发一种能够录制键盘和键盘的基本实用程序软件。鼠标输入,将输入保存到.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鼠标方法()的基本接口,我甚至直接从Robot类调用mousePress方法。

这种方法中可能出现的故障是什么?

1 个答案:

答案 0 :(得分: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);
}

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