首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >鼠标移动过程中机器人不按鼠标的方法

鼠标移动过程中机器人不按鼠标的方法
EN

Stack Overflow用户
提问于 2018-05-19 06:36:08
回答 1查看 50关注 0票数 0

我目前正在开发一个基本的实用软件,它能够记录键盘和鼠标输入,将输入保存到.txt文件中,并在文件中回放数据。我正在修改程序,以增加文件和播放功能。我遇到的问题是鼠标移动方法中的Robot.mousePress()方法:

代码语言:javascript
复制
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类的基本扩展类,具有复合机器人鼠标方法()的基本接口,我甚至直接从机器人类调用mousePress方法。

在这种方法中会发生什么故障?

EN

回答 1

Stack Overflow用户

发布于 2018-05-23 07:33:43

解决了。改进了一种处理鼠标运动的方法,使鼠标每帧移动一次。这个类现在可以精确地在鼠标移动之间执行各种检查和数据更改,同时也允许其他类在不受冗长for循环影响的情况下工作。这个问题中的方法效率极低,不切实际,基本上是一个“时间”循环。

代码语言:javascript
复制
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);
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50422527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档