使用该类生成输入事件与将事件发布到AWT事件队列或AWT组件不同,因为事件是在平台的原生输入队列中生成的。例如,Robot.mouseMove
实际上会移动鼠标光标,而不仅仅是生成鼠标移动事件。
请注意,一些平台需要特殊权限或扩展来访问低级输入控制。如果当前平台配置不允许输入控制,则在尝试构造Robot对象时将抛出AWTException
异常。例如,如果X-Window系统不支持(或未启用)XTEST 2.2标准扩展,则会抛出异常。
除了自我测试之外,使用Robot的应用程序应该优雅地处理这些错误条件。
平台和桌面环境可能对Robot类中所需的访问权限施加限制或限制。例如:
- 阻止访问桌面的任何部分或桌面上不属于运行应用程序的窗口的内容。
- 将窗口装饰视为非所有者内容。
- 忽略或限制特定请求以操作窗口。
- 忽略或限制与键盘和鼠标等Robot生成的(合成的)事件相关的特定请求。
- 要求对窗口内容的任何访问或甚至对事件的有限合成具有特定或全局权限。
- 每次都需要
- 或在应用程序的生命周期内持久
- 或在多个用户桌面会话中持久
- 是细粒度的权限
- 与特定二进制应用程序或一类二进制应用程序相关联。
- 自JDK版本:
- 1.3
-
Constructor Summary
ConstructorDescriptionRobot()
在主屏幕的坐标系中构造一个Robot对象。Robot
(GraphicsDevice screen) 为给定的屏幕设备创建一个Robot。 -
Method Summary
Modifier and TypeMethodDescriptioncreateMultiResolutionScreenCapture
(Rectangle screenRect) 创建一个包含从屏幕读取的像素的图像。createScreenCapture
(Rectangle screenRect) 创建一个包含从屏幕读取的像素的图像。void
delay
(int ms) 休眠指定的时间。int
在生成事件后返回的毫秒数。getPixelColor
(int x, int y) 返回给定屏幕坐标处像素的颜色。boolean
返回此Robot在生成事件后是否自动调用waitForIdle
。void
keyPress
(int keycode) 按下给定的键。void
keyRelease
(int keycode) 释放给定的键。void
mouseMove
(int x, int y) 将鼠标指针移动到给定的屏幕坐标。void
mousePress
(int buttons) 按下一个或多个鼠标按钮。void
mouseRelease
(int buttons) 释放一个或多个鼠标按钮。void
mouseWheel
(int wheelAmt) 旋转带有滚轮的鼠标上的滚轮。void
setAutoDelay
(int ms) 设置Robot在生成事件后休眠的毫秒数。void
setAutoWaitForIdle
(boolean isOn) 设置此Robot在生成事件后是否自动调用waitForIdle
。toString()
返回此Robot的字符串表示形式。void
等待当前事件队列中的所有事件被处理。
-
Constructor Details
-
Robot
在主屏幕的坐标系中构造一个Robot对象。- 抛出:
-
AWTException
- 如果平台配置不允许低级输入控制。当GraphicsEnvironment.isHeadless()返回true时,将始终抛出此异常。 -
SecurityException
- 如果未授予createRobot
权限 - 参见:
-
Robot
为给定的屏幕设备创建一个Robot。传递给Robot方法调用(如mouseMove、getPixelColor和createScreenCapture)的坐标将被解释为与指定屏幕相同的坐标系。请注意,根据平台配置,多个屏幕可能会:- 共享相同的坐标系以形成组合虚拟屏幕
- 使用不同的坐标系作为独立屏幕
如果重新配置屏幕设备以影响坐标系,则现有Robot对象的行为是未定义的。
- 参数:
-
screen
- 表示Robot将在其中操作的坐标系的屏幕GraphicsDevice。 - 抛出:
-
AWTException
- 如果平台配置不允许低级输入控制。当GraphicsEnvironment.isHeadless()返回true时,将始终抛出此异常。 -
IllegalArgumentException
- 如果screen
不是屏幕GraphicsDevice。 -
SecurityException
- 如果未授予createRobot
权限 - 参见:
-
-
Method Details
-
mouseMove
public void mouseMove(int x, int y) 将鼠标指针移动到给定的屏幕坐标。在某些平台上,鼠标指针可能不会在视觉上移动,而后续的mousePress和mouseRelease可以传递到正确的位置
- 参数:
-
x
- X位置 -
y
- Y位置
-
mousePress
public void mousePress(int buttons) 按下一个或多个鼠标按钮。应使用mouseRelease(int)
方法释放鼠标按钮。- 参数:
-
buttons
- 按钮掩码;一个或多个鼠标按钮掩码的组合。只允许使用有效值的组合作为
buttons
参数。有效组合包括InputEvent.BUTTON1_DOWN_MASK
、InputEvent.BUTTON2_DOWN_MASK
、InputEvent.BUTTON3_DOWN_MASK
和由InputEvent.getMaskForButton(button)
方法返回的值。有效组合还取决于Toolkit.areExtraMouseButtonsEnabled()
的值,如下所示:- 如果Java禁用了对扩展鼠标按钮的支持,则只允许使用以下标准按钮掩码:
InputEvent.BUTTON1_DOWN_MASK
、InputEvent.BUTTON2_DOWN_MASK
、InputEvent.BUTTON3_DOWN_MASK
。 - 如果Java启用了对扩展鼠标按钮的支持,则允许使用标准按钮掩码和现有扩展鼠标按钮的掩码,如果鼠标有超过三个按钮。这样,可以使用与范围从1到
MouseInfo.getNumberOfButtons()
的按钮对应的按钮掩码。
建议使用InputEvent.getMaskForButton(button)
方法通过其编号获取任何鼠标按钮的掩码。
还接受以下标准按钮掩码:
InputEvent.BUTTON1_MASK
InputEvent.BUTTON2_MASK
InputEvent.BUTTON3_MASK
InputEvent.BUTTON1_DOWN_MASK
、InputEvent.BUTTON2_DOWN_MASK
、InputEvent.BUTTON3_DOWN_MASK
。扩展的_DOWN_MASK
或旧的_MASK
值应该被使用,但这两种模型不应混合使用。 - 如果Java禁用了对扩展鼠标按钮的支持,则只允许使用以下标准按钮掩码:
- 抛出:
-
IllegalArgumentException
- 如果buttons
掩码包含额外鼠标按钮的掩码,并且Java禁用了对扩展鼠标按钮的支持 -
IllegalArgumentException
- 如果buttons
掩码包含鼠标上不存在的额外鼠标按钮的掩码,并且Java启用了对扩展鼠标按钮的支持 - 参见:
-
mouseRelease
public void mouseRelease(int buttons) 释放一个或多个鼠标按钮。- 参数:
-
buttons
- 按钮掩码;一个或多个鼠标按钮掩码的组合。只允许使用有效值的组合作为
buttons
参数。有效组合包括InputEvent.BUTTON1_DOWN_MASK
、InputEvent.BUTTON2_DOWN_MASK
、InputEvent.BUTTON3_DOWN_MASK
和由InputEvent.getMaskForButton(button)
方法返回的值。有效组合还取决于Toolkit.areExtraMouseButtonsEnabled()
值如下:- 如果Java禁用了对扩展鼠标按钮的支持,则只允许使用以下标准按钮掩码:
InputEvent.BUTTON1_DOWN_MASK
、InputEvent.BUTTON2_DOWN_MASK
、InputEvent.BUTTON3_DOWN_MASK
。 - 如果Java启用了对扩展鼠标按钮的支持,则允许使用标准按钮掩码和现有扩展鼠标按钮的掩码,如果鼠标有超过三个按钮。这样,可以使用对应于从1到
MouseInfo.getNumberOfButtons()
的按钮的按钮掩码。
建议使用InputEvent.getMaskForButton(button)
方法通过其编号获取任何鼠标按钮的掩码。
还接受以下标准按钮掩码:
InputEvent.BUTTON1_MASK
InputEvent.BUTTON2_MASK
InputEvent.BUTTON3_MASK
InputEvent.BUTTON1_DOWN_MASK
、InputEvent.BUTTON2_DOWN_MASK
、InputEvent.BUTTON3_DOWN_MASK
。扩展的_DOWN_MASK
或旧的_MASK
值应该被使用,但这两种模式不应混合使用。 - 如果Java禁用了对扩展鼠标按钮的支持,则只允许使用以下标准按钮掩码:
- 抛出:
-
IllegalArgumentException
- 如果buttons
掩码包含额外鼠标按钮的掩码,并且Java禁用了对扩展鼠标按钮的支持 -
IllegalArgumentException
- 如果buttons
掩码包含鼠标上不存在的额外鼠标按钮的掩码,并且Java启用了对扩展鼠标按钮的支持 - 参见:
-
mouseWheel
public void mouseWheel(int wheelAmt) 旋转配备滚轮的鼠标上的滚轮。- 参数:
-
wheelAmt
- 移动鼠标滚轮的“凹槽”数量。负值表示向上/远离用户的移动,正值表示向下/靠近用户的移动。 - 自1.4版本起:
- 1.4
-
keyPress
public void keyPress(int keycode) 按下给定的键。应使用keyRelease
方法释放该键。与多个物理键关联的键代码(例如
KeyEvent.VK_SHIFT
可能表示左或右Shift键)将映射到左键。- 参数:
-
keycode
- 要按下的键(例如KeyEvent.VK_A
) - 抛出:
-
IllegalArgumentException
- 如果keycode
不是有效键 - 参见:
-
keyRelease
public void keyRelease(int keycode) 释放给定的键。与多个物理键关联的键代码(例如
KeyEvent.VK_SHIFT
可能表示左或右Shift键)将映射到左键。- 参数:
-
keycode
- 要释放的键(例如KeyEvent.VK_A
) - 抛出:
-
IllegalArgumentException
- 如果keycode
不是有效键 - 参见:
-
getPixelColor
返回给定屏幕坐标处像素的颜色。如果桌面环境要求授予权限以捕获屏幕内容,并且未授予所需权限,则可能会抛出
SecurityException
,或者返回的Color
的内容未定义。- API注释:
- 建议避免在AWT事件分发线程上调用此方法,因为屏幕捕获可能是一个耗时的操作,特别是如果需要获取权限并涉及用户交互。
- 参数:
-
x
- 像素的X位置 -
y
- 像素的Y位置 - 返回:
- 像素的颜色
- 抛出:
-
SecurityException
- 如果未授予readDisplayPixels
权限,或者桌面环境拒绝访问屏幕
-
createScreenCapture
创建包含从屏幕读取的像素的图像。如果桌面环境要求授予权限以捕获屏幕内容,并且未授予所需权限,则可能会抛出
SecurityException
,或者返回的BufferedImage
的内容未定义。- API注释:
- 建议避免在AWT事件分发线程上调用此方法,因为屏幕捕获可能是一个耗时的操作,特别是如果需要获取权限并涉及用户交互。
- 参数:
-
screenRect
- 屏幕坐标中要捕获的矩形 - 返回:
- 捕获的图像
- 抛出:
-
IllegalArgumentException
- 如果screenRect
的宽度和高度不大于零 -
SecurityException
- 如果未授予readDisplayPixels
权限,或者桌面环境拒绝访问屏幕 - 参见:
-
createMultiResolutionScreenCapture
创建包含从屏幕读取的像素的图像。如果用户空间到屏幕(设备)空间存在缩放变换,则可以使用此方法。通常这意味着显示器是高分辨率屏幕,尽管严格来说,这意味着存在这样的变换。返回一个MultiResolutionImage
。对于非缩放显示,
MultiResolutionImage
将具有一个图像变体:- 用户指定大小的基本图像。
对于存在缩放变换的高分辨率显示,
MultiResolutionImage
将具有两个图像变体:- 用户指定大小的基本图像。这是从屏幕缩放的。
- 具有设备大小像素的本机设备分辨率图像。
示例:
Image nativeResImage; MultiResolutionImage mrImage = robot.createMultiResolutionScreenCapture(frame.getBounds()); List<Image> resolutionVariants = mrImage.getResolutionVariants(); if (resolutionVariants.size() > 1) { nativeResImage = resolutionVariants.get(1); } else { nativeResImage = resolutionVariants.get(0); }
- 参数:
-
screenRect
- 屏幕坐标中要捕获的矩形 - 返回:
- 捕获的图像
- 抛出:
-
IllegalArgumentException
- 如果screenRect
的宽度和高度不大于零 -
SecurityException
- 如果未授予readDisplayPixels
权限,或者桌面环境拒绝访问屏幕 - 自9版本起:
- 9
- 参见:
-
isAutoWaitForIdle
public boolean isAutoWaitForIdle()返回此Robot在生成事件后是否自动调用waitForIdle
。- 返回:
-
是否自动调用
waitForIdle
-
setAutoWaitForIdle
public void setAutoWaitForIdle(boolean isOn) 设置此Robot在生成事件后是否自动调用waitForIdle
。- 参数:
-
isOn
- 是否自动调用waitForIdle
-
getAutoDelay
public int getAutoDelay()返回此Robot在生成事件后睡眠的毫秒数。- 返回:
- 毫秒为单位的延迟持续时间
-
setAutoDelay
public void setAutoDelay(int ms) 设置此Robot在生成事件后睡眠的毫秒数。- 参数:
-
ms
- 延迟持续时间(以毫秒为单位) - 抛出:
-
IllegalArgumentException
- 如果ms
不在0到60,000毫秒(包括)之间
-
delay
public void delay(int ms) 休眠指定的时间。如果调用线程在等待时被中断,则将立即返回并设置中断状态。如果已经设置了中断状态,则此方法将立即返回并设置中断状态。
- 参数:
-
ms
- 以毫秒为单位的休眠时间 - 抛出:
-
IllegalArgumentException
- 如果ms
不在0
到60,000
毫秒(包括)之间
-
waitForIdle
public void waitForIdle()等待直到当前事件队列中的所有事件都被处理完毕。- 抛出:
-
IllegalThreadStateException
- 如果在AWT事件分派线程上调用
-
toString
返回此Robot的字符串表示形式。
-