当前位置: 首页 > 面试题库 >

Java robot.mouseMove(x,y)无法产生正确的结果

郏兴贤
2023-03-14
问题内容

我最近一直在尝试使我制作的程序自动化,但是遇到了一个问题,robot.mouseMove(100,100)不会将鼠标发送到100,100。

我做了一个简单的程序来展示这一点:

new Robot().mouseMove(100, 100);
System.out.println(MouseInfo.getPointerInfo().getLocation().getX() + " , "
        + MouseInfo.getPointerInfo().getLocation().getY());

每次我运行此代码都会产生不同的结果:

54.0 , 54.0
0.0 , 0.0
58.0 , 58.0

当您将其循环放置时,鼠标会接近正确的位置。代码:

Robot b = new Robot();  
for (int i = 1; i < 10; i++) {
        b.mouseMove(100, 100);
        System.out.println("Attempt "+i+" : "+MouseInfo.getPointerInfo().getLocation().getX() + " , "
                + MouseInfo.getPointerInfo().getLocation().getY());
    }

结果:

Attempt 1 : 12.0 , 21.0
Attempt 2 : 143.0 , 139.0
Attempt 3 : 79.0 , 81.0
Attempt 4 : 110.0 , 109.0
Attempt 5 : 96.0 , 96.0
Attempt 6 : 101.0 , 102.0
Attempt 7 : 100.0 , 99.0
Attempt 8 : 100.0 , 100.0
Attempt 9 : 100.0 , 100.0
Attempt 10 : 100.0 , 100.0

我不知道发生了什么,但任何帮助将不胜感激。谢谢。为了澄清我正在运行Windows 10和Java版本1.8.0_161。我的ThinkPad
E460屏幕为1920x1080,缩放比例为150%。更改比例不会影响该问题,但是,似乎将屏幕分辨率降低到最低可能(800x600)时,鼠标指针离所指示的位置更近了。这可能只是因为像素较少,错误空间较小。

在800x600屏幕上显示的结果:

Attempt 1 : 101.0 , 101.0
Attempt 2 : 99.0 , 100.0
Attempt 3 : 101.0 , 99.0
Attempt 4 : 100.0 , 101.0
Attempt 5 : 99.0 , 99.0
Attempt 6 : 101.0 , 101.0
Attempt 7 : 100.0 , 99.0
Attempt 8 : 99.0 , 101.0
Attempt 9 : 101.0 , 99.0
Attempt 10 : 99.0 , 101.0

编辑:不幸的是,每个循环创建一个新的机器人不是问题。我已经更新了代码(结果更加详尽)。

编辑2:刚刚将Java从1.8.0_151更新为1.8.0_161,相同的问题仍然存在。


问题答案:

在JDK的Bug网站说当前的解决方法是调用函数的循环,直到鼠标移动到右侧的空间。您可以使用如下功能:

public static void moveMouse(int x, int y, int maxTimes, Robot screenWin) {
    for(int count = 0;(MouseInfo.getPointerInfo().getLocation().getX() != x || 
            MouseInfo.getPointerInfo().getLocation().getY() != y) &&
            count < maxTimes; count++) {
        screenWin.mouseMove(x, y);
    }
}

最大时间可以阻止无限循环,以防万一。通常4-5倍对我来说已经足够了。



 类似资料:
  • 问题内容: 几年前我有这个面试问题,但是我还没有找到答案。 做无限循环的x和y应该是什么? 我们试着用,, VS 。 问题答案: 您需要两个可比较,具有相同值但代表不同实例的变量,例如: 和都为true,因为取消了装箱,但是实例相等性为false。 请注意,它也可以与一起使用,并且任何值(不仅是0)都可以使用。 您还可以使用JVM的复杂性-它们通常仅缓存最多127个整数,因此也可以使用: (但是1

  • 我有一个简单的程序,它允许用户在黑框中绘制白色像素。当用户单击蓝色按钮时,我希望我的程序遍历绘制框中的所有像素并将像素数据添加到数组中以供以后在另一个项目中使用。然而,即使用户在那里绘制了图像,它也只会为每个像素返回黑色。

  • 问题内容: 该蟒蛇风格指南建议对进口组这样的: 导入应按以下顺序分组: 标准库导入 相关第三方进口 本地应用程序/特定于库的导入 但是,它没有提及应如何布置两种不同的进口方式的内容: 对它们进行排序有多种方法(假设所有这些导入都属于同一组): 首先,然后 from x import xx import abc import def import x 首先,然后 import def import

  • 本文向大家介绍写一个方法,使得sum(x)(y)和sum(x,y)返回的结果相同相关面试题,主要包含被问及写一个方法,使得sum(x)(y)和sum(x,y)返回的结果相同时的应答技巧和注意事项,需要的朋友参考一下 此题考函数式编程: const sum = (x, y) => (typeof y === "undefined") ? (y)=> x+y : x+y console.log(sum

  • 我现在正在尝试学习自由Gdx。但是,我遇到了一个非常非常奇怪的问题。经过一番谷歌搜索,我开始认为我是唯一一个。基本上,每当我运行应用程序时,它都会开始在屏幕上快速闪烁随机图像 奇怪的是,当渲染方法什么都不做时,它也会这样做。我尝试从其中删除所有代码,但仍然得到相同的输出。 以下是呈现方法中发生的情况: 另一件奇怪的事情是Gdx.graphics。getDeltaTime()总是为我返回0。