3030import de .openindex .support .core .io .ScreenResponse ;
3131import de .openindex .support .core .io .ScreenTile ;
3232import de .openindex .support .core .io .SocketHandler ;
33+ import de .openindex .support .customer .utils .Robot ;
3334import java .awt .AWTException ;
3435import java .awt .Desktop ;
3536import java .awt .GraphicsConfiguration ;
3637import java .awt .GraphicsDevice ;
37- import java .awt .Toolkit ;
38- import java .awt .datatransfer .Clipboard ;
39- import java .awt .datatransfer .DataFlavor ;
40- import java .awt .datatransfer .StringSelection ;
4138import java .awt .event .ActionEvent ;
4239import java .awt .event .ActionListener ;
4340import java .awt .event .KeyEvent ;
6360import javax .swing .UIManager ;
6461import org .apache .commons .io .FileUtils ;
6562import org .apache .commons .io .IOUtils ;
63+ import org .apache .commons .lang3 .CharUtils ;
6664import org .apache .commons .lang3 .StringUtils ;
6765import org .apache .commons .lang3 .SystemUtils ;
6866import org .slf4j .ILoggerFactory ;
@@ -410,28 +408,17 @@ public void processReceivedObject(Serializable object) {
410408
411409 if (request .keyCode != KeyEvent .VK_UNDEFINED )
412410 robot .keyPress (request .keyCode );
413- /* else if (request.keyChar != KeyEvent.CHAR_UNDEFINED) {
411+ else if (request .keyChar != KeyEvent .CHAR_UNDEFINED ) {
414412 int code = KeyEvent .getExtendedKeyCodeForChar (request .keyChar );
415-
416- //LOGGER.debug("special key pressed : " +
417- request.keyChar + " / " +
418- code + " / " +
419- KeyEvent.getKeyText(code) + " / " +
420- Character.isLetterOrDigit(request.keyChar)
421- );
422-
423- try {
424- if (code != KeyEvent.VK_UNDEFINED) {
425- //LOGGER.debug("> press");
413+ //LOGGER.debug("key pressed: " + request.keyChar + " / " + code + " / " + CharUtils.isAsciiPrintable(request.keyChar));
414+ if (CharUtils .isAsciiAlphanumeric (request .keyChar ) && code != KeyEvent .VK_UNDEFINED ) {
415+ try {
426416 robot .keyPress (code );
417+ } catch (IllegalArgumentException ex ) {
418+ LOGGER .warn ("Can't press key '" + request .keyChar + "' (" + code + "): " + ex .getLocalizedMessage ());
427419 }
428- } catch (IllegalArgumentException ex) {
429- //LOGGER.debug("Can't press key " +
430- "(" + request.keyChar + "): " +
431- ex.getLocalizedMessage() + "!");
432420 }
433-
434- }*/
421+ }
435422
436423 } else if (object instanceof KeyReleaseRequest ) {
437424
@@ -441,29 +428,17 @@ public void processReceivedObject(Serializable object) {
441428 if (request .keyCode != KeyEvent .VK_UNDEFINED )
442429 robot .keyRelease (request .keyCode );
443430 else if (request .keyChar != KeyEvent .CHAR_UNDEFINED ) {
444- /*int code = KeyEvent.getExtendedKeyCodeForChar(request.keyChar);
445- boolean doPaste = code == KeyEvent.VK_UNDEFINED
446- || !CharUtils.isAscii(request.keyChar);
447-
448- //LOGGER.debug("special key released : " +
449- request.keyChar + " / " +
450- code + " / " +
451- KeyEvent.getKeyText(code) + " / " +
452- doPaste);
453-
454- try {
455- if (code != KeyEvent.VK_UNDEFINED) {
456- //LOGGER.debug("> release");
431+ int code = KeyEvent .getExtendedKeyCodeForChar (request .keyChar );
432+ //LOGGER.debug("key released: " + request.keyChar + " / " + code + " / " + CharUtils.isAsciiPrintable(request.keyChar));
433+ if (robot .isPressed (code )) {
434+ try {
457435 robot .keyRelease (code );
436+ } catch (IllegalArgumentException ex ) {
437+ LOGGER .warn ("Can't release key '" + request .keyChar + "' (" + code + "): " + ex .getLocalizedMessage ());
458438 }
459- } catch (IllegalArgumentException ex) {
460- //LOGGER.debug("Can't release key " +
461- "(" + request.keyChar + "): " +
462- ex.getLocalizedMessage() + "!");
463- doPaste = true;
439+ } else {
440+ robot .printCharacter (request .keyChar );
464441 }
465- if (doPaste) robot.printSpecialChar(request.keyChar);*/
466- robot .printSpecialChar (request .keyChar );
467442 }
468443
469444 } else if (object instanceof MouseMoveRequest ) {
@@ -515,76 +490,6 @@ public void stop() {
515490 }
516491 }
517492
518- private static class Robot extends java .awt .Robot {
519- private Robot (GraphicsDevice screen ) throws AWTException {
520- super (screen );
521- //setAutoDelay(50);
522- setAutoWaitForIdle (true );
523- }
524-
525- private void pasteText (String text ) {
526- //waitForIdle();
527-
528- final Clipboard clipboard = Toolkit .getDefaultToolkit ().getSystemClipboard ();
529- String oldClipboardValue ;
530- try {
531- oldClipboardValue = (String ) clipboard .getData (DataFlavor .stringFlavor );
532- } catch (Exception ex ) {
533- //LOGGER.warn("Can't read clipboard value!", ex);
534- oldClipboardValue = StringUtils .EMPTY ;
535- }
536- try {
537- clipboard .setContents (new StringSelection (text ), null );
538-
539- if (SystemUtils .IS_OS_MAC_OSX )
540- keyPress (KeyEvent .VK_META );
541- else
542- keyPress (KeyEvent .VK_CONTROL );
543-
544- keyPress (KeyEvent .VK_V );
545- keyRelease (KeyEvent .VK_V );
546-
547- if (SystemUtils .IS_OS_MAC_OSX )
548- keyRelease (KeyEvent .VK_META );
549- else
550- keyRelease (KeyEvent .VK_CONTROL );
551- } finally {
552- if (oldClipboardValue != null )
553- clipboard .setContents (new StringSelection (oldClipboardValue ), null );
554- }
555- }
556-
557- private void printSpecialChar (char code ) {
558- //waitForIdle();
559- //LOGGER.debug("printSpecialChar: " + code);
560-
561- // release modifier keys, that may have been set previously
562- keyRelease (KeyEvent .VK_SHIFT );
563- keyRelease (KeyEvent .VK_CONTROL );
564- keyRelease (KeyEvent .VK_ALT );
565- keyRelease (KeyEvent .VK_ALT_GRAPH );
566- if (SystemUtils .IS_OS_MAC_OSX )
567- keyRelease (KeyEvent .VK_META );
568-
569- // paste the special character through the system clipboard
570- pasteText (String .valueOf (code ));
571-
572- // emulate input of special characters
573- //keyPress(KeyEvent.VK_ALT);
574- //keyPress(KeyEvent.VK_NUMPAD0);
575- //keyRelease(KeyEvent.VK_NUMPAD0);
576- //String altCode = Integer.toString(code);
577- //for (int i = 0; i < altCode.length(); i++) {
578- // code = (char) (altCode.charAt(i) + '0');
579- // //delay(20);//may be needed for certain applications
580- // keyPress(code);
581- // //delay(20);//uncomment if necessary
582- // keyRelease(code);
583- //}
584- //keyRelease(KeyEvent.VK_ALT);
585- }
586- }
587-
588493 private static class ScreenShooter implements ActionListener , ResponseFactory {
589494 private final ScreenRequest request ;
590495 private BufferedImage [] lastSlices = null ;
0 commit comments