package org.comtel.javafx.robot; import java.awt.AWTException; import java.awt.Component; import java.awt.KeyboardFocusManager; import java.awt.Robot; import java.awt.event.KeyEvent; import static java.awt.event.KeyEvent.*; import javax.swing.SwingUtilities; import org.slf4j.LoggerFactory; public class AWTRobotHandler implements IRobot { private final static org.slf4j.Logger logger = LoggerFactory.getLogger(AWTRobotHandler.class); private final int controlKeyEvent; public AWTRobotHandler() { String osName = System.getProperty("os.name"); if (osName.toLowerCase().startsWith("mac")) { controlKeyEvent = VK_META; } else { controlKeyEvent = VK_CONTROL; } } @Override public void sendToComponent(Object source, final char ch, final boolean ctrl) { logger.trace("fire: {}", ch); SwingUtilities.invokeLater(new Runnable() { public void run() { send(ch, ctrl); } }); } private void send(char ch, boolean ctrl) { Component c = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); if (c == null || !c.isEnabled()) { logger.warn("no awt focus owner"); return; } final Robot robot; try { robot = new Robot(); } catch (AWTException e) { logger.error(e.getMessage(), e); return; } if (ctrl) { switch (Character.toUpperCase(ch)) { case VK_A: robot.keyPress(controlKeyEvent); robot.keyPress(VK_A); robot.keyRelease(VK_A); robot.keyRelease(controlKeyEvent); return; case VK_X: robot.keyPress(controlKeyEvent); robot.keyPress(VK_X); robot.keyRelease(VK_X); robot.keyRelease(controlKeyEvent); return; case VK_C: robot.keyPress(controlKeyEvent); robot.keyPress(VK_C); robot.keyRelease(VK_C); robot.keyRelease(controlKeyEvent); return; case VK_V: robot.keyPress(controlKeyEvent); robot.keyPress(VK_V); robot.keyRelease(VK_V); robot.keyRelease(controlKeyEvent); return; } switch (ch) { case VK_ENTER: robot.keyPress(VK_ENTER); robot.keyRelease(VK_ENTER); return; case VK_BACK_SPACE: robot.keyPress(VK_BACK_SPACE); robot.keyRelease(VK_BACK_SPACE); return; case VK_DELETE: robot.keyPress(VK_DELETE); robot.keyRelease(VK_DELETE); return; case VK_ESCAPE: robot.keyPress(VK_ESCAPE); robot.keyRelease(VK_ESCAPE); return; case VK_SPACE: robot.keyPress(VK_SPACE); robot.keyRelease(VK_SPACE); return; case VK_TAB: robot.keyPress(VK_TAB); robot.keyRelease(VK_TAB); return; case VK_UP: robot.keyPress(VK_UP); robot.keyRelease(VK_UP); return; case VK_DOWN: robot.keyPress(VK_DOWN); robot.keyRelease(VK_DOWN); return; case VK_LEFT: robot.keyPress(VK_LEFT); robot.keyRelease(VK_LEFT); return; case VK_RIGHT: robot.keyPress(VK_RIGHT); robot.keyRelease(VK_RIGHT); return; } } if (Character.isWhitespace(ch)) { robot.keyPress(ch); robot.keyRelease(ch); return; } int modififiers = Character.isUpperCase(ch) ? SHIFT_DOWN_MASK : 0; KeyboardFocusManager.getCurrentKeyboardFocusManager().dispatchKeyEvent( new KeyEvent(c, KEY_PRESSED, System.currentTimeMillis(), modififiers, VK_UNDEFINED, ch, KEY_LOCATION_STANDARD)); KeyboardFocusManager.getCurrentKeyboardFocusManager().dispatchKeyEvent( new KeyEvent(c, KEY_TYPED, System.currentTimeMillis(), modififiers, VK_UNDEFINED, ch, KEY_LOCATION_UNKNOWN)); KeyboardFocusManager.getCurrentKeyboardFocusManager().dispatchKeyEvent( new KeyEvent(c, KEY_RELEASED, System.currentTimeMillis(), modififiers, VK_UNDEFINED, ch, KEY_LOCATION_STANDARD)); } }