Focus d'applications [Résolu]

Signaler
Messages postés
600
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
8 juillet 2016
-
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
-
Bonjour les gens,

Avant de clairement expliquer ma question, je vais donner le contexte...
Je travaille sur un outil d'automatisation de test d'interfaces graphiques JAVA. Pour automatiser les actions sur le GUI, un agent est lancé avec le programme JAVA à contrôler.
Cependant suite au popups et autres fenêtres modales, un vérification est faite pour vérifiée que la fenêtre à contrôler est bien active.
Pour un système simple (un seul process JAVA (de une ou plusieurs fenêtres) ça fonctionne mais des que l'on a deux process java (et donc deux agents), impossible de faire en sorte que les fenêtres des deux process soient activables.

Je cherche un moyen de dire à l'OS "donne le focus à cette application ou à celle là" ou encore "moi, application X, je veux le focus"...
En gros je veux faire la même chose que si un utilisateur clique dans une fenêtre... mais sans souris....

Il y a la solution du ALT-TAB (via robot) mais la il ne sera pas facile (du tout) de savoir si c'est la bonne application qui à le focus....

je sais qu'en JAVA tout seul ce n'est pas possible mais comme je n'ai aucune piste...

au besoin, je peux donner plus d'information ou tenter de mieux expliquer la problématique....


--

2 réponses

Messages postés
600
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
8 juillet 2016
11
Bon j'ai fini par trouver une solution... si cela intéresse quelqu'un la voici:

pour faire en sorte que le programme java obtienne le focus de la part du système, il faut :

1. faire en sorte qu'une fenetre existente demande le focus
2. créer une nouvelle fenetre, l'afficher puis la supprimer

pour faire simple, avec un bout de code, cela donne :
// la fenetre vide qui va faire en sorte que l'application reprenne le focus système
JFrame newFrame = new JFrame();
newFrame.pack();
newFrame.setVisible(true);
newFrame.toFront();
newFrame.setVisible(false);
newFrame.dispose();

//component est un composant de la fenetre à activer
Component parent = component;
//recherche la fenetre contenant le composant.
// la condition !(parent instanceof Window) permets d'éviter de prendre le parent d'un JDialog par exemple (on veux activer le JDialog par sa fenetre parente)
while ( parent != null && !(parent instanceof Window) )
{
	parent = parent.getParent();
}
//active la fenetre
if ( parent != null )
{
	((Window)parent).toFront();
	((Window)parent).requestFocus();
}


Pour bien faire, ce code doit être utiliser dans la thread swing.... (cfr SwingUtilities.invokeLater(Runnable) )
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
355
Salut,

J'avais vu ta question mais je n'avais aucune idée pour la résolution. Merci d'avoir posté le code qui a résolu ton problème.

a+