我可以在R中控制鼠标光标吗?

Ber*_*rnd 3 keyboard mouse r rjava

是否可以从R控制台控制鼠标指针?

我有这样的想法:

move_mouse(x_pos=100,y_pos=200)   # move the mouse pointer to position (100,200)
mouse_left_button_down            # simulate a press of the left button
move_mouse(x_pos=120,y_pos=250)   # move mouse to select something
mouse_release_left_button          # release the pressed button
Run Code Online (Sandbox Code Playgroud)

在MATLAB中,使用以下代码可以实现类似的目的

import java.awt.Robot;
mouse = Robot;
mouse.mouseMove(0, 0);
mouse.mouseMove(100, 200);
Run Code Online (Sandbox Code Playgroud)

我尝试将上述内容直接转换为R,如下所示:

install.packages("rJava")          # install package
library(rJava)                     # load package
.jinit()                           # this starts the JVM
jRobot <- .jnew("java/awt/Robot")  # Create object of the Robot class
Run Code Online (Sandbox Code Playgroud)

一旦在R中获得了jRobot,我尝试使用下面的两个命令将其方法称为“ MouseMove(100,200)”,这两个命令均会导致错误。

jRobot$mouseMove(10,10)

Error in .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl,  : 
              java.lang.NoSuchMethodException: No suitable method for the given parameters
Run Code Online (Sandbox Code Playgroud)

要么

.jcall(jRobot,, "mouseMove",10,10)
Error in .jcall(jRobot, , "mouseMove", 10, 10) : 
              method mouseMove with signature (DD)V not found
Run Code Online (Sandbox Code Playgroud)

Ber*_*rnd 5

终于我找到了问题。您必须告诉R 100是整数,才能正确地将其传递给Java。

install.packages("rJava")          # install package
library(rJava)                     # load package
.jinit()                           # this starts the JVM
jRobot <- .jnew("java/awt/Robot")  # Create object of the Robot class

# Let java sleep 500 millis between the simulated mouse events
.jcall(jRobot,, "setAutoDelay",as.integer(500))

# move mouse to 100,200 and select the text up to (100,300)         
.jcall(jRobot,, "mouseMove",as.integer(100),as.integer(200))
.jcall(jRobot,, "mousePress",as.integer(16))
.jcall(jRobot,, "mouseMove",as.integer(100),as.integer(300))
.jcall(jRobot,, "mouseRelease",as.integer(16))
Run Code Online (Sandbox Code Playgroud)