(en tout cas, ré-étiquettez avec la technologie appropriée : Je ne sais pas lesquelles :)
Je reviendrai probablement plus tard avec des questions plus précises, sur des détails spécifiques, mais pour l'instant, j'essaie de saisir la "vue d'ensemble" : Je cherche un moyen d'énumérer les "fenêtres réellement visibles" sur Windows. Par "fenêtre visible réelle", j'entends ce qu'un utilisateur appelle une "fenêtre". Je cherche un moyen d'obtenir une liste de toutes ces fenêtres visibles, dans l'ordre Z.
Notez que I faire Il faut vraiment le faire. Je l'ai déjà fait sous OS X (où c'est un vrai casse-tête à faire, surtout si vous voulez prendre en charge OS X 10.4, car OS X n'a pas d'API Windows pratique) et maintenant je dois le faire sous Windows.
Voici un exemple, supposons qu'il y ait trois fenêtres visibles à l'écran, comme ceci :
+------------------------------------------+
| |
| +=============+ |
| | | |
| | A +--------------------------+
| | | |
| C | | B |
| | +--------------------------+
| | | |
+-----------| |----------------+
| |
+-------------+
Alors je dois récupérer une liste comme celle-ci :
windows B is at (210,40)
windows A is at (120,20)
windows C is at (0,0)
Ensuite, si l'utilisateur (ou le système d'exploitation) met la fenêtre A à l'avant, cela devient :
+------------------------------------------+
| |
| +=============+ |
| | | |
| | A |---------------------+
| | | |
| C | | B |
| | |---------------------+
| | | |
+-----------| |----------------+
| |
+-------------+
Et je reçois (idéalement) un rappel me donnant ceci :
windows A is at (120,20)
windows B is at (210,40)
windows C is at (0,0)
Faire cela sous OS X nécessite l'utilisation de bidouillages étonnamment bizarres (comme demander à l'utilisateur d'allumer la fonction "Activer l'accès pour les appareils fonctionnels" !) mais je l'ai fait sous OS X et ça marche (sous OS X, je n'ai pas réussi à obtenir un callback à chaque fois qu'un changement de fenêtre se produit, donc je sonde, mais j'ai réussi à le faire fonctionner).
Maintenant, je veux faire cela sous Windows (je le veux vraiment, sans aucun doute) et j'ai quelques questions :
-
Est-ce possible ?
-
Existe-t-il des API Windows bien documentées (et fonctionnant conformément à leurs spécifications) permettant de faire cela ?
-
est-il facile d'enregistrer un callback chaque fois qu'une fenêtre change ? (si elle est redimensionnée, déplacée, mise en avant ou en arrière, ou si une nouvelle fenêtre apparaît, etc.)
-
quels seraient les écueils ?
Je sais que cette question n'est pas spécifique, c'est pourquoi j'ai essayé de décrire mon problème aussi clairement que possible (y compris une belle illustration ASCII pour laquelle vous pouvez voter en faveur de cette question) : pour l'instant, je cherche à avoir une vue d'ensemble. Je veux savoir ce que cela implique de faire une telle chose sous Windows.
Question bonus : imaginez que vous ayez besoin d'écrire un minuscule .exe écrire le nom/la position/la taille de Windows dans un fichier temporaire chaque fois qu'il y a un changement de fenêtre à l'écran, combien de temps un tel programme serait-il approximativement dans la langue de votre choix et combien de temps vous faudrait-il pour l'écrire ?
(une fois encore, j'essaie d'avoir une vue d'ensemble pour comprendre ce qui se passe ici).
0 votes
Personne ? Déjà +1 upvote et 1 favori... :)
0 votes
Je pense que vous devriez commencer par FindWindowEx pour énumérer toutes les fenêtres dans l'ordre Z, puis utiliser GetWindowLong pour obtenir le style de la fenêtre. Évidemment, vous ne tiendriez compte que des fenêtres avec WS_VISIBLE, et peut-être WS_CAPTION ou autre.
0 votes
.net framework est-il une option ? J'ai une solution simple pour ça, ça prend 10 secondes.
0 votes
@Roddy : merci... En fait, c'est parce que je suis un peu très naïf : Je ne sais pas comment poster des images sur SO (je ne sais pas où je suis censé "mettre" l'image : Je n'ai pas de serveur/page web et je ne sais pas si je peux "envoyer" une image directement à SO). Donc, pas d'image : allons-y pour de l'art ASCII :)
0 votes
@Cyclone : .net n'est pas vraiment une option : il s'agit de quelque chose qui fonctionne à la fois sur OS X et Windows (il est écrit en Java). J'ai environ 99% de code Java et 1% de code spécifique à la plateforme (comme le code qui trouve la position de Windows sur OS X, qui fonctionne déjà). Mais je suis toujours curieux : quelle serait votre solution avec .net ? Peut-être pouvez-vous la poster ici comme réponse, en précisant qu'il s'agit de .net ? Je la mettrai en avant, c'est sûr !
0 votes
Je viens de réaliser que ma solution ne fonctionne que pour la fenêtre "principale" de chaque processus en cours, désolé !
0 votes
Comment les avez-vous énumérés dans OS X ?
0 votes
Si possible, pouvez-vous expliquer comment vous avez fait cela sous OS X ?
0 votes
En rapport : stackoverflow.com/questions/6091531/