[英]Robot.mouseMove not moving to specified location properly
每当我为机器人运行mouseMove
命令时,鼠标并不总是移动到相同的位置。 例如,我有以下代码:
import java.awt.Robot;
import java.util.concurrent.TimeUnit;
public class MainBot {
public static void main(String[] args){
try {
Robot screenWin = new Robot();
TimeUnit.SECONDS.sleep(2);
screenWin.mouseMove(100, 300);
} catch (Exception e) {
e.printStackTrace();
}
}
}
代码通常使鼠标在 X 处结束:
首先,我点击运行(我正在使用 eclipse)并将我的鼠标移动到一个位置(在 2 秒计时器结束之前)。 然后 2 秒延迟结束,鼠标移动,然后脚本结束。 问题是,鼠标似乎永远不会去同一个确切的地方两次。 例如,鼠标应该去(100, 300)
但它大部分时间看起来像(0, 300)
。 然而,其他时候,如果我在开始时将鼠标移动到应该大致的位置,然后它会移动到正确的位置。
我知道鼠标应该在哪里使用 Paint 来获取屏幕截图的像素位置,但我不认为这是因为位置不断变化。
有什么我遗漏了mouseMove
坐标的工作方式吗?
编辑:基本上,我用那个程序开始,然后我将鼠标移动到一个新位置(所以在mouseMove
函数之前有一个不同的初始位置),然后mouseMove
执行。 每次我这样做时,鼠标都会移动到不同的位置。
OpenJDK 上有一个开放的错误,所以这可能是相关的:
Windows 10 Fall Creators 更新中可能引入的问题的错误详细信息,与屏幕缩放和 mouse_move 功能相关。
同时,您可以尝试将屏幕比例设置为 100% 而不是 125%,看看是否有帮助。
我找到了一个解决方案,您只需将鼠标移动到坐标 (0,0) 然后您就可以将其移动到您想要的位置。
我写了一个类来做正确的光标定位。 这也适用于 Windows 10 缩放比例。
使用 MoveMouseControlled(double, double) 函数将光标移动到指定位置。 它使用 [0,1] 坐标系。 (0,0) 点是屏幕的左上角。
import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.Robot;
import java.awt.Toolkit;
public class MouseCorrectRobot extends Robot
{
final Dimension ScreenSize;// Primary Screen Size
public MouseCorrectRobot() throws AWTException
{
super();
ScreenSize = Toolkit.getDefaultToolkit().getScreenSize();
}
private static double getTav(Point a, Point b)
{
return Math.sqrt((double) ((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)));
}
public void MoveMouseControlled(double xbe, double ybe)// Position of the cursor in [0,1] ranges. (0,0) is the upper left corner
{
int xbepix = (int) (ScreenSize.width * xbe);
int ybepix = (int) (ScreenSize.height * ybe);
int x = xbepix;
int y = ybepix;
Point mert = MouseInfo.getPointerInfo().getLocation();
Point ElozoInitPont = new Point(0, 0);
int UgyanAztMeri = 0;
final int UgyanAZtMeriLimit = 30;
int i = 0;
final int LepesLimit = 20000;
while ((mert.x != xbepix || mert.y != ybepix) && i < LepesLimit && UgyanAztMeri < UgyanAZtMeriLimit)
{
++i;
if (mert.x < xbepix)
++x;
else
--x;
if (mert.y < ybepix)
++y;
else
--y;
mouseMove(x, y);
mert = MouseInfo.getPointerInfo().getLocation();
if (getTav(ElozoInitPont, mert) < 5)
++UgyanAztMeri;
else
{
UgyanAztMeri = 0;
ElozoInitPont.x = mert.x;
ElozoInitPont.y = mert.y;
}
}
}
}
我刚刚遇到了类似的问题,为了解决它,我刚刚做了一个循环:
它总是在少于 2 个循环中工作
Point pd = new Point(X,Y); // X,Y where mouse must go
int n = 0;
while ((!pd.equals(MouseInfo.getPointerInfo().getLocation())) && (++n <= 5))
{
r.mouseMove(pd.x, pd.y);
}
它在全屏模式下运行良好(正确位置), zoom=100% 。 在 chrome 中按 F-11 到全屏页面。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.