Robot.mouseMove在Mac OS X中根本不起作用

时间:2018-11-01 14:32:34

标签: java macos mousemove awtrobot macos-mojave

我在IntelliJ IDE中使用该代码创建了Java文件

import java.awt.AWTException;
import java.awt.MouseInfo;
import java.awt.Robot;

public class JavaRobotExample {
    public static void main(String[] args) {
        int x = 12,
                y = 300;
        try {
            Robot robot = new Robot();
            robot.mouseMove(x, y);

            int xAct = (int)    MouseInfo.getPointerInfo().getLocation().getX(),
                    yAct = (int) MouseInfo.getPointerInfo().getLocation().getY();

            String sPred = String.format("Predicted mouse location : %, d, %, d", x, y),
                    sAct = String.format("Actual mouse location : %, d, %, d", xAct, yAct);

            System.out.println(sPred);
            System.out.println(sAct);
        } catch (AWTException e) {
            e.printStackTrace();
        }
    }
}

该示例在Windows 7环境中运行良好,但是在Mac OS 10.14上,相同的代码不会使用mouseMove方法移动鼠标(但会通过MouseInfo类读取位置)。

我也没有收到任何例外,例如

有人以前有类似的问题吗?有任何想法如何使该代码在Mac OS中工作?

最好的问候,

2 个答案:

答案 0 :(得分:5)

我也遇到同样的问题。我有一条语句“ robot.mouseMove(100,100);”鼠标完全不动。我有一个研究思路。我在运行代码时注意到MacOS发出的警告或信息性消息。问我有关授予我的程序控制屏幕或系统之类的权限的问题。我试图单击“允许”复选框,但不允许我这样做。我将对此进行更多研究。我认为这是MacOS的事情。您(和我)必须告诉MacOS,我们的Java程序可以控制鼠标。

我认为这是解决方案。 。

在“系统偏好设置”中(“齿轮”图标),在“安全性和隐私”下,单击顶部的“隐私”选项卡,然后在左侧选择“辅助功能”。这列出了所有可以“控制您的计算机”的程序。我正在使用STS,而不是IntelliJ。我看到STS与BetterSnapTool和KeyCastr一起列出。同时检查BetterSnapTool和KeyCastr。未检查STS。而且,所有这些均灰显,因此我无法更改任何支票。窗口左下方有一个“锁定”图标。我单击该图标,然后出现提示询问密码(我具有一定级别的sysadmin特权)。我输入了密码,现在可以“检查” STS。我“检查”了STS(您将“检查” IntelliJ)。在“检查” STS之后,我再次单击左下方的“锁定”图标。这“关闭”了锁。现在,当我运行程序时,robot命令会移动鼠标。

答案 1 :(得分:0)

答案是“可以”和“不能”。让我们从“不能”开始。

不能:

macOS似乎错误地检测到来自IntelliJ的移动鼠标尝试,而实际上却来自java。您可以授予IntelliJ所需的所有权限,但是java将在授予IntelliJ权限后将永远无法移动光标。

IntelliJ(这是Java应用程序)正在运行子进程来启动您的程序。子进程是java命令行,与IntelliJ捆绑在一起的java不同。该子进程需要权限。

可以:

这有点四处。

  1. 使用Gradle构建项目,IntelliJ可以识别Gradle项目并与它们很好地交互
  2. 从macOS系统偏好设置->安全和隐私中的“可访问性”权限中删除所有出现的IntelliJ和Java。
  3. 确保所有Gradle守护进程都已停止(或者如果尚未运行Gradle,则请确保下一步是自上次重新引导计算机以来Gradle第一次运行)
  4. 使用Gradle从命令行运行您的应用程序
  5. macOS将提示您授予权限,打开系统偏好设置并授予java权限。
  6. 运行IntelliJ并通过IntelliJ和voila将您的应用程序作为gradle项目运行!

会发生什么:IntelliJ,在第6步中,使用已经运行的gradle守护进程来执行您的应用程序。此过程正在使用java,并且java有权在macOS系统偏好设置中移动鼠标光标。

虽然不漂亮,但是可以。如果您像我一样,无论如何都可以在IntelliJ中对Java项目使用gradle,而要做的就是记住要从命令行运行项目,然后再从IntelliJ运行它。这样,gradle守护程序(一个java进程)将负责运行该应用程序,并且macOS将检测到适当的权限。

我使用以下代码对此进行了测试(请注意一些修改,因为OP代码具有一些“错误”):

import javax.swing.SwingUtilities;
import java.awt.AWTException;
import java.awt.MouseInfo;
import java.awt.Robot;
import java.lang.reflect.InvocationTargetException;

public class RunRobot {
    public static void main(String[] args) {
        int x = 12,
            y = 300;
        final int[] xAct = new int[1],
                    yAct = new int[1];
        try {
            Robot robot = new Robot();
            robot.mouseMove(x, y);
            robot.waitForIdle();

            SwingUtilities.invokeAndWait(()->{
                xAct[0] = (int) MouseInfo.getPointerInfo().getLocation().getX();
                yAct[0] = (int) MouseInfo.getPointerInfo().getLocation().getY();
            });

            String sPred = String.format("Predicted mouse location : %, d, %, d", x, y),
                   sAct  = String.format("Actual    mouse location : %, d, %, d", xAct[0], yAct[0]);

            System.out.println(sPred);
            System.out.println(sAct);
        } catch (InterruptedException | AWTException | InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}