我使用该代码在 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 中运行吗?
致以诚挚的问候,
我也有同样的问题。我有一个声明“robot.mouseMove(100, 100);”并且鼠标根本不动。我有一个想法要研究。当我运行代码时,我注意到 MacOS 发出警告或信息类型的消息。它询问我有关授予我的程序控制屏幕或系统或其他东西的权限。我尝试单击“允许”复选框,但它不允许我这样做。我会再研究一下。我认为这是 MacOS 的问题。你(和我)必须告诉 MacOS 我们的 Java 程序可以控制鼠标。
我认为这就是解决方案。 。 .
在“系统偏好设置”(“齿轮”图标)中的“安全和隐私”下,单击顶部的“隐私”选项卡,然后选择左侧的“辅助功能”。这列出了所有可以“控制您的计算机”的程序。我使用的是 STS,而不是 IntelliJ。我看到 STS 与 BetterSnapTool 和 KeyCastr 一起列出。 BetterSnapTool 和 KeyCastr 均已选中。未检查 STS。而且,所有这些都呈灰色,因此我无法更改任何检查。窗口左下角有一个锁定图标。我单击该图标,然后出现提示,询问我的密码(我有一定程度的系统管理员权限)。我输入了密码,现在可以“检查”STS。我“检查”了STS(您将“检查”IntelliJ)。 “检查”STS后,我再次单击左下角的锁定图标。这样就“关闭”了锁。现在,当我运行程序时,机器人命令会移动我的鼠标。
答案是“你可以”和“你不能”。让我们从“不能”开始吧。
不能:
macOS 似乎错误地将移动鼠标的尝试检测为来自 IntelliJ,而事实上,它来自
java
。你可以给IntelliJ所有你想要的权限,但是当权限给IntelliJ后java
将永远无法移动光标。
IntelliJ(这是一个 Java 应用程序)正在运行一个子进程来启动您的程序。子进程是
java
命令行,与与 IntelliJ 捆绑的 java
不同。该子进程需要权限。
可以:
这有点绕。
java
权限。会发生什么: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();
}
}
}