每当我为机器人运行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
函数之前有一个不同的初始位置)然后{ {1}}执行。每次我这样做,鼠标都会转到不同的位置。
答案 0 :(得分:2)
我找到了一个解决方案,只需将鼠标移至坐标(0,0),然后将其移至所需位置即可。
答案 1 :(得分:1)
我写了一个类来做正确的光标定位。 这也适用于Windows 10 scalings。
使用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 :(得分:0)
OpenJDK上存在一个漏洞,所以这可能是相关的:
该错误详细说明了Windows 10 Fall Creators更新中可能引入的一个问题,与屏幕缩放和mouse_move功能有关。
与此同时,您可以尝试将屏幕比例设置为100%而不是125%,看看是否有帮助。
答案 3 :(得分:0)
我只是遇到了类似的问题,为解决这个问题,我做了一个循环:
它总是少于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);
}
答案 4 :(得分:0)
在全屏模式下使用 zoom = 100%,效果很好(正确的位置)。按chrome中的F-11进入全屏页面。