Usar Java para establecer el foco en una aplicación que no sea Java en Windows

Me gustaría escribir una aplicación que crea entrada para una aplicación que no es Java en Windows. Con la clase Robot es fácil generar la entrada, pero necesito establecer el foco en el cuadro de texto de otra aplicación e ingresar el texto allí.

No se preocupe, no estoy tratando de escribir algo malicioso, solo quiero usar Java para “extender” una aplicación antigua escrita en Delphi.

CMDOW es una utilidad de línea de comandos que le permite realizar varias acciones de ventana, como activar / desactivar, enumerar, minimizar / maximizar, etc.

Alternativamente , puede escribir un VBScript para activar otra aplicación. Por ejemplo:

Set WshShell = WScript.CreateObject("WScript.Shell") WshShell.AppActivate("Firefox") 

Luego use Runtime.exec desde su aplicación Java para ejecutar el script.

Esto te ayudará a activar otra aplicación.

Sin embargo , será mucho más difícil si desea enfocarse en un cuadro de texto dentro de la otra aplicación y escribir algún texto.

Detectar una aplicación especial y llevarla al frente podría requerir un ayudante nativo, pero por el momento podría enviar ALT + TAB para activar la “próxima” aplicación

Esto funciona:

 public void switchFocus() { try { Robot r = new Robot(); r.keyPress(KeyEvent.VK_ALT); r.keyPress(KeyEvent.VK_TAB); r.keyRelease(KeyEvent.VK_ALT); r.keyRelease(KeyEvent.VK_TAB); } catch(AWTException e) { // handle } } 

solo necesita implementar un método de conveniencia para mapear caracteres (de una cadena) a valores de eventos clave … (o encuentre alguna solución existente)

Configure un retraso de lo contrario no funcionará:

 Robot r = new Robot(); r.keyPress(KeyEvent.VK_ALT); r.keyPress(KeyEvent.VK_TAB); r.delay(10); //set the delay r.keyRelease(KeyEvent.VK_ALT); r.keyRelease(KeyEvent.VK_TAB); 

En Mac, es posible hacerlo con AppleScript. AppleScript está integrado al sistema, por lo que siempre será funcional. https://developer.apple.com/library/content/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_cmds.html

Solo necesita detectar que está en Mac y tiene el nombre de la aplicación.

 Runtime runtime = Runtime.getRuntime(); String[] args = { "osascript", "-e", "tell app \"Chrome\" to activate" }; Process process = runtime.exec(args); 

Debe agregar suficiente demora para que la aplicación se inicialice por completo y obtenga enfoque.

Aquí hay un ejemplo básico de trabajo … Andreas_D es correcto que necesita emular la clave del sistema para alternar entre progtwigs … ( Alt + Tab en Windows, Cmd + Tab en OS X)

  import java.awt.*; import static java.awt.event.KeyEvent.*; import java.io.IOException; public class RobotSample { //https://stackoverflow.com/questions/4782231 private static Integer[] KEY_CODES = { VK_S, VK_T, VK_A, VK_C, VK_K, VK_O, VK_V, VK_E, VK_R, VK_F, VK_L,VK_O, VK_W, VK_DECIMAL, VK_C, VK_O, VK_M, VK_SLASH, VK_Q, VK_U, VK_E, VK_S, VK_T, VK_I, VK_O, VK_N, VK_S, VK_SLASH, VK_4, VK_7, VK_8, VK_2, VK_2, VK_3, VK_1, VK_ENTER }; public static void main( String[] args ) throws IOException { try { Robot robot = new Robot(); Runtime runtime = Runtime.getRuntime(); runtime.exec( "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe" ); robot.keyPress( VK_ALT ); robot.keyPress( VK_TAB ); robot.keyRelease( VK_ALT ); robot.keyRelease( VK_TAB ); //Chill a sec... robot.delay( 1000 ); for(int i = 0; i < KEY_CODES.length; ++i) { robot.keyPress( KEY_CODES[i] ); robot.keyRelease( KEY_CODES[i] ); robot.delay( 80 ); } } catch( AWTException e ) { e.getMessage(); } } }