我在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中工作?
最好的问候,
答案 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
不同。该子进程需要权限。
可以:
这有点四处。
java
权限。会发生什么: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();
}
}
}