2011-01-24 12 views
15

Me gustaría escribir una aplicación que crea entradas 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í.Uso de Java para establecer el foco en una aplicación que no es Java en Windows

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

+1

Una opción alternativa es que mi aplicación Java nunca se pone el foco, por lo que el uso de las ventanas tiene el enfoque y al hacer clic en un botón en la aplicación Java el foco no se pierde en la ventana original. No tengo idea si eso es posible? –

+0

para aquellos que vienen a esta pregunta a través de google, en OSX: http://stackoverflow.com/questions/14859733/set-focus-of-any-application-with-java-osx – ericsoco

Respuesta

9

CMDOW es una utilidad de línea de comandos que le permite realizar varias acciones ventanas, tales como la activación/desactivación, perfil, minimizar/maximizar etc.

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

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

A continuación, utilice Runtime.exec de su aplicación Java para ejecutar el script.

Esto lo ayudará a activar otra aplicación.

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

+0

solo tengo que decir que me gusta CMDOW pero Noté 2 problemas ... muy lento ... en mi sistema de aceleración térmica sobrecargado - pidiendo un nuevo ventilador ahora - por lo que para la mayoría de los usuarios no sé si será notable, sin embargo, nircmd funcionó mucho más rápido ... por lo que solo se puede saber nircmd también es una opción: no admite comodines, pero puede especificar si coincide con la subcadena o desde el inicio o desde el final del título. Tampoco pude conseguir que activara varias ventanas con la misma subcadena, nircmd podría hacer esto ... así que por estas 2 razones elegí nircmd en su lugar ... – ycomp

7

La detección de una aplicación especial y trayendo que uno en la parte delantera pueden requerir un ayudante nativo, pero por el momento se 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 
    } 
} 

sólo tiene que poner en práctica un método de conveniencia para mapear caracteres (de una cadena) a los valores de eventos de teclas ... (o encontrar alguna solución existente)

6

configurar un retardo 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); 
0

Es necesario añadir suficiente retraso para la aplicación para inicializar y obtener el foco totalmente.

Aquí está un ejemplo de trabajo básica ... Andreas_D es correcto que se necesita para emular la llave del sistema para cambiar entre programas ... (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(); 
      } 

     } 

    } 
1

en Mac, no 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); 
Cuestiones relacionadas