Modifier Z Order Windows avec JNA
Oliv
-
Oliv -
Oliv -
Bonjour à toutes et à tous,
je voudrais pouvoir inverser le comportement des fenêtres dans Windows (avec JNA donc) grâce à une application java, quand elle est active. Je parle bien des fenêtres ouvertes (réduites ou non) sur le bureau, qu'elles proviennent d'applis java ou non.
Le comportement que je voudrais leur donner consisterais à donner à toute fenêtre restaurée la dernière position du Z Order.
C'est-à-dire que si j'ai deux applis lancées, l'une dont la fenêtre est seule visible à l'écran, l'autre dont la fenêtre est réduite à son icône dans la barre des tâches, et que je clique sur cette icône pour restaurer cette fenêtre, celle-ci devrait apparaître à l'écran DERRIÈRE la fenêtre qui était déjà visible et ne pas prendre le focus. Même chose pour une appli avec plusieures fenêtres, plusieures applis avec plusieures fenêtres, et même chose aussi si la restauration est spontanée (non provoquée par une action de l'utilisateur).
Il y a quelques temps, j'avais fait un bidouillage, consistant à recupérer et stocker en boucle le nom des fenêtres visibles, comparer la première d'entre elles avec la première du tour de boucle précédant, et en cas de changement, envoyer la nouvelle en dernière position.
Le "problème" étant que j'interviens APRÈS qu'elle soit d'abord passée par le premier plan et aie brièvement pris le focus.
Dans certains cas, ce brièvement n'est pas assez court, et provoque des erreurs de manipulation.
Est-il possible de faire ça plus proprement ?
Merci de toute aide, tuyau, conseil...
je voudrais pouvoir inverser le comportement des fenêtres dans Windows (avec JNA donc) grâce à une application java, quand elle est active. Je parle bien des fenêtres ouvertes (réduites ou non) sur le bureau, qu'elles proviennent d'applis java ou non.
Le comportement que je voudrais leur donner consisterais à donner à toute fenêtre restaurée la dernière position du Z Order.
C'est-à-dire que si j'ai deux applis lancées, l'une dont la fenêtre est seule visible à l'écran, l'autre dont la fenêtre est réduite à son icône dans la barre des tâches, et que je clique sur cette icône pour restaurer cette fenêtre, celle-ci devrait apparaître à l'écran DERRIÈRE la fenêtre qui était déjà visible et ne pas prendre le focus. Même chose pour une appli avec plusieures fenêtres, plusieures applis avec plusieures fenêtres, et même chose aussi si la restauration est spontanée (non provoquée par une action de l'utilisateur).
Il y a quelques temps, j'avais fait un bidouillage, consistant à recupérer et stocker en boucle le nom des fenêtres visibles, comparer la première d'entre elles avec la première du tour de boucle précédant, et en cas de changement, envoyer la nouvelle en dernière position.
Le "problème" étant que j'interviens APRÈS qu'elle soit d'abord passée par le premier plan et aie brièvement pris le focus.
Dans certains cas, ce brièvement n'est pas assez court, et provoque des erreurs de manipulation.
Est-il possible de faire ça plus proprement ?
Merci de toute aide, tuyau, conseil...
A voir également:
- Modifier Z Order Windows avec JNA
- Modifier dns - Guide
- Modifier liste déroulante excel - Guide
- Clé windows 8 - Guide
- Montage video windows - Guide
- Windows ne démarre pas - Guide
1 réponse
Bonjour,
Le JNA c'est une technologie pour manipuler du code Windows en Java, mais ta question relève plus de comment le faire avec Windows que comment le faire en Java.
Ce serait peut-être donc plus une question pour un forum Windows que pour un forum Java.
Concernant JNA, voici un exemple qui manipule GetForegroundWindow
Le JNA c'est une technologie pour manipuler du code Windows en Java, mais ta question relève plus de comment le faire avec Windows que comment le faire en Java.
Ce serait peut-être donc plus une question pour un forum Windows que pour un forum Java.
Concernant JNA, voici un exemple qui manipule GetForegroundWindow
import java.awt.Rectangle; import com.sun.jna.Native; import com.sun.jna.platform.win32.WinDef.HWND; import com.sun.jna.platform.win32.WinDef.RECT; public class WindowsUtils { private static class User32Dll { static { Native.register("user32"); } public static native HWND GetForegroundWindow(); public static native boolean GetWindowRect(HWND hWnd, RECT lpRect); } /** @return le rectangle représentant la position et la taille de la fenêtre active */ public static Rectangle getActiveWindowPosition(){ RECT rect = new RECT(); User32Dll.GetWindowRect(User32Dll.GetForegroundWindow(), rect); return new Rectangle(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top); } }
D'autre part le code sera en java parce que c'est le seul langage qui ne m'est pas totalement étranger (je ne vais pas apprendre tout un langage aussi complexe et risqué que le C -comparativement- pour un seul et minuscule petit programme.
Ce dont j'ai besoin, c'est que cette fameuse fenêtre reste toujours au premier plan, même si d'autres fenêtres, venant d'autres applications ou non, venaient à être ouvertes ou restaurées.
Autrement dit comment faire pour qu'une fenêtre ayant le focus sur le bureau ne le perde jamais et ne sois jamais recouverte, quoiqu'il arrive tant qu'elle est affichée à l'écran.
Merci encore !
Il aurait fallu une section Java Native Access (et donc 1 000 autres dérivés du même genre, ce qui ne ferait pas très sérieux).
Mais j'avais quand même tagué "Windows" hein ?
Blague à part, merci de t'être déjà penché sur mon cas.
Toute la difficulté sera de trouver dans les api Windows les bonnes méthodes qui feront ce que tu veux.
Soit en fouillant la documentation (qui est faite pour ça) soit en se renseignant auprès de ceux qui s'en servent, peut-être des développeurs C++ ? Mais en tout cas, ce n'est pas sur un forum Java qu'on pourra te renseigner.
Je voudrais quand même laisser un petit moment la question ouverte, car c'est en posant cette même question dans les mêmes lieux et conditions que j'avais à l'époque pu mettre au point la méthode décrite, qui fait exactement ce que je veux APRÈS l'apparition d'une fenêtre (JUSTE après, voire pendant, suivant l'animation, mais pas avant).
Je répète que je ne comprend rien au C, c'est le JNA (oui il appelle le C, mais surtout, il le manipule -pointeurs et consorts) qu'il me faut. C'est-à-dire que si tu m'avais donné le code C pour récupérer la fenêtre de premier plan, je n'aurais rien pu en faire, contrairement à celui que tu m'a donné.
Mais... Je vais peut-être AUSSI voir du côté du forum Windows non pas du point de vue programmation, mais du logiciel. Peut-être qu'il existe un moyen de changer le comportement par défaut des fenêtres, car après tout, le fait qu'elles soit envoyées au premier plan et prennent le focus, c'est déjà un réglage. Peut-on y accéder ? Par les registres ? (J'aimerais pas ça mais bon...)
Je mettrais le lien de l'autre ici et vice-versa, puis signalerais l'éventuelle réponse à ma portée, non programmatique ici si il y en a une, disons quelques jours pour ceux éventuellement qui suivent sans se manifester, avant de supprimer cette discussion en tant que doublon ; ou vice-versa.
Puis-je ?
Personne ne peut m'aider ?
Le code que j'avais mis au point est le suivant :
Ce serait mieux si je pouvais intervenir sur l'évènement qui restaure une fenêtre et non sur la liste des fenêtres non réduites.
Mais je ne vois rien nul part pour ça. C'est un hook, mais comment ?
S'il vous plait...