2010-04-22 10 views
5

Estoy interactuando con una aplicación de terceros utilizando su API, y me gustaría moverlo al frente del foco (para que esté encima de todas las otras ventanas abiertas) cuando un usuario realiza una determinada acción. Si bien puedo mover mi aplicación hacia arriba y hacia abajo en la jerarquía con bastante facilidad, no parece haber una forma de interactuar con otras ventanas. ¿Es posible mover la ventana de otro programa al frente con Java?¿Puedo mover la ventana de otro programa al frente del foco?

Respuesta

1

No es posible en Java puro y en ciertos sistemas operativos ni siquiera es posible obtener limpiamente la otra posición de Windows (por ejemplo, buena suerte hacerlo bajo OS X 10.4: OS X 10.4 no no tienen ningún medio documentado para registrarse para eventos de otras ventanas ... Hay "hacks", pero son realmente hackish, como requerir que el usuario active las preferencias "Permitir dispositivo auxiliar", lo que requiere la contraseña de administrador de OS X).

0

que estaba buscando una solución a un problema muy similar. Hasta ahora he encontrado uno - muy frágil! - solución. Funciona para mi caso, porque mi caso implica ejecutar sesiones completas utilizando java.awt.Robot sin interacción del usuario, por lo que puede funcionar o no para su caso.

La solución está utilizando java.awt.Robot para enviar las pulsaciones de teclas como Alt+Tab para llevar la ventana deseada al frente. Esta es frágil, por supuesto, debido a múltiples razones:

  • el robot no puede saber con qué frecuencia Alt+Tab necesidades que se envía para obtener la ventana deseada a frente. La ventana es una en muchos. Esta solución solo funciona si ya se sabe qué ventana en términos de Alt-Tab -contesta que es.
  • Dependiendo del sistema operativo, las teclas requeridas en realidad podrían ser otra cosa.

En caso de que el sistema operativo y la secuencia de la ventana son conocidos, es decir, el programa puede saber por adelantado el número de pulsaciones de teclas Alt-Tab sería necesario, a veces esto podría ser una solución.

El siguiente programa Java muestra cómo hacerlo. Si se llama sin argumentos, genera exactamente una pulsación de tecla Alt+Tab. Si se llama con argumentos, el programa asume que el primer argumento es un número y generará tantas pulsaciones de teclado Alt+Tab como lo especifique ese número.

Es posible que desee jugar un poco con los valores de tiempo dados en robot.delay() y robot.setAutoDelay() para ofrecer la mejor experiencia en su máquina. Consejo: al menos en Linux, robot.setAutoDelay() debería ser menor que el retraso de repetición del teclado; de lo contrario, el sistema operativo generaría varias pulsaciones de teclas Alt-Tab en la cola de eventos del sistema debido a la repetición de las teclas.

import java.awt.AWTException; 
import java.awt.Robot; 
import static java.awt.event.KeyEvent.VK_ALT; 
import static java.awt.event.KeyEvent.VK_TAB; 
import static java.lang.Integer.parseInt; 

public class WindowSwitcher { 
    public static void main(final String... args) throws AWTException { 
     final int repeat = args.length != 0 ? parseInt(args[0]) : 1; 
     final Robot robot = createRobot(); 
     robot.keyPress(VK_ALT); 
     for (int i = 0; i < repeat; i++) { 
      robot.keyPress(VK_TAB); 
      robot.keyRelease(VK_TAB); 
      robot.delay(500); 
     } 
     robot.keyRelease(VK_ALT); 
    } 
    public static Robot createRobot() throws AWTException { 
     final Robot robot = new Robot(); 
     robot.setAutoWaitForIdle(true); 
     robot.setAutoDelay(10); 
     return robot; 
    } 
} 
Cuestiones relacionadas