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

问题描述 投票:0回答:3

我使用该代码在 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 中运行吗?

致以诚挚的问候,

java macos mousemove awtrobot macos-mojave
3个回答
24
投票

我也有同样的问题。我有一个声明“robot.mouseMove(100, 100);”并且鼠标根本不动。我有一个想法要研究。当我运行代码时,我注意到 MacOS 发出警告或信息类型的消息。它询问我有关授予我的程序控制屏幕或系统或其他东西的权限。我尝试单击“允许”复选框,但它不允许我这样做。我会再研究一下。我认为这是 MacOS 的问题。你(和我)必须告诉 MacOS 我们的 Java 程序可以控制鼠标。

我认为这就是解决方案。 。 .

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


1
投票

我在 macOS 上也遇到了同样的问题。但最终我找到了一种方法。

  1. 从源创建一个 .jar 文件。 (只需在 netbeans 中执行 Clean & Build 即可完成)

  2. 之后进入系统偏好设置>隐私和安全>辅助功能>选择“终端”并将其打开(如下所示) 如果“终端”在辅助功能中不可见,您可以添加按“+”按钮

3.通过终端运行.jar 文件。然后机器人功能将被执行! 使用此命令通过终端运行 .jar 文件

java -jar /Users/<username>/Documents/MyApp.jar

享受!


0
投票

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

不能:

macOS 似乎错误地将移动鼠标的尝试检测为来自 IntelliJ,而事实上,它来自

java
。你可以给IntelliJ所有你想要的权限,但是当权限给IntelliJ后
java
将永远无法移动光标。

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 将您的应用程序作为 gradle 项目运行,瞧!

会发生什么:IntelliJ 在步骤 6 中使用已经运行的 gradle 守护进程来执行您的应用程序。此过程使用

java
并且
java
有权在 macOS 系统偏好设置中移动鼠标光标。

虽然不漂亮,但很有效。如果您像我一样,无论如何都会在 IntelliJ 中对 java 项目使用 gradle,并且您所要做的就是记住在从 IntelliJ 运行项目之前先从命令行运行项目。这样,gradle 守护进程(

java
进程)将负责运行应用程序,并且 macOS 将检测到适当的权限。

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

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();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.