2011-01-24 14 views
15

Vorrei scrivere un'applicazione che crea input per un'applicazione non Java in Windows. Con la classe Robot è facile generare l'input, ma ho bisogno di mettere a fuoco la casella di testo di un'altra applicazione e inserire il testo laggiù.Utilizzo di Java per impostare lo stato attivo su un'applicazione non Java in Windows

Non preoccuparti Non sto cercando di scrivere qualcosa di malevolo, voglio solo usare Java per "estendere" una vecchia applicazione scritta in Delphi.

+1

Un'opzione alternativa è che la mia applicazione Java non viene mai la messa a fuoco, in modo che l'applicazione delle finestre ha la messa a fuoco e quando si fa clic su un pulsante sulla applicazione Java l'attenzione non si perde mai nella finestra originale. Non ho idea se sia possibile? –

+0

per chi viene a questa domanda via google, su OSX: http://stackoverflow.com/questions/14859733/set-focus-of-any-application-with-java-osx – ericsoco

risposta

9

CMDOW è un'utility a riga di comando che consente di eseguire varie azioni di finestra, come l'attivazione/disattivazione, profilo, riducendo al minimo/massimizzando ecc

alternativa, è possibile scrivere un VBScript per attivare un'altra applicazione. Per esempio:

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

Quindi utilizzare Runtime.exec dalla tua app Java per eseguire lo script.

Questo ti aiuterà ad attivare un'altra applicazione.

Tuttavia, sarà molto più difficile se si desidera concentrarsi su una casella di testo all'interno di un'altra applicazione e scrivere del testo.

+0

devo solo dire che mi piace il CMDOW ma Ho notato 2 problemi .. molto lento .. sul mio sovraccarico sistema di limitazione termica - ordinare un nuovo fan ora - quindi per la maggior parte degli utenti non so se sarà evidente, tuttavia nircmd ha funzionato molto più velocemente .. quindi basta far sapere alla gente nircmd è anche un'opzione - non supporta i caratteri jolly ma puoi specificare se la sottostringa corrisponde o dall'inizio o dalla fine del titolo. Inoltre non ho potuto farlo attivare più finestre con la stessa sottostringa, nircmd potrebbe farlo .. quindi per questi 2 motivi ho scelto nircmd invece .. – ycomp

7

Rilevamento un'applicazione speciale e portando quella verso la parte anteriore potrebbe richiedere un aiuto nativo, ma per il momento è possibile inviare ALT + TAB per attivare l'applicazione "next"

Questo funziona:

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 
    } 
} 

hai solo bisogno di implementare un metodo comodo per mappare caratteri (da una stringa) ai valori degli eventi chiave ... (o trovare qualche soluzione esistente)

6

Configurare un ritardo altrimenti non funzionerà:

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

è necessario aggiungere abbastanza ritardo per l'applicazione per inizializzare completamente e ottenere messa a fuoco.

Ecco un esempio di lavoro di base ... Andreas_D è corretto che avete bisogno di emulare la chiave di sistema per passare da un programma ... (Alt +Tab su Windows, Cmd +Tab su 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(); 
      } 

     } 

    } 
Problemi correlati