[UNDOCUMENTED CG] CGSGetWindowLevel() : récupérer le niveau d'une fenêtre
Bru
Membre
void CGSGetWindowLevel(int cid, int wid, int *level)
La fonction CGSGetWindowLevel de l'api Core Graphics permet de récupérer le "niveau"(level) d'une fenêtre.
Le niveau permet de déterminer le type de fenêtre selon le tableau suivant (liste non-exhaustive):
commentaire
fenêtre normale (ou standard)
fenêtre flottante
fenêtre du dock
icône dans le dock (icône ou fenêtre miniaturisée)
barre des menus active
mini-icône de statut (à droite dans la barre des menus)
ombre sous la barre de menu
icône du finder sur le desktop
fond d'écran
La fonction CGSGetWindowLevel de l'api Core Graphics permet de récupérer le "niveau"(level) d'une fenêtre.
- cid : id de connection au window-server
- wid : id de la fenêtre visée
- level : niveau retourné par la focntion
Le niveau permet de déterminer le type de fenêtre selon le tableau suivant (liste non-exhaustive):
level
commentaire
0
fenêtre normale (ou standard)
3
fenêtre flottante
20
fenêtre du dock
21
icône dans le dock (icône ou fenêtre miniaturisée)
24
barre des menus active
25
mini-icône de statut (à droite dans la barre des menus)
-20
ombre sous la barre de menu
-2147483607
icône du finder sur le desktop
-2147483628
fond d'écran
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Un grand merci pour toutes ces précisions sur ces méthodes non documentées.
[mode = remarque pour ce cas-ci]
Je viens de le remarquer par hasard: on peut visiblement arriver au même résultat en utilisant uniquement des fonctions documentées:
[tt]int level = CGWindowLevelForKey([aWindow level]);[/tt]
Non.
La fonction CGWindowLevelForKey permet d'obtenir un window-level "officiel" à partir d'une constante key-level.
Par exemple, pour connaà®tre le window-level d'une fenêtre standard, il faut passer la constante kCGNormalWindowLevelKey (qui vaut 4). La valeur retournée est 0, ce qui correspond au level d'une fenêtre normale.
L'utilité de cette fonction est moindre, puisque les levels des fenêtres sont eux aussi documentés (en partie) par Apple (voir ici ou dans le fichier CGWindowLevel.h présent dans les sdk des Developer tools).
D'autre part (mais ça, tu ne pouvais pas le savoir), la doc Apple sur la méthode level de NSWindow est partiellement inexacte. Cette méthode retourne un window-level, et non un key-level.
Donc, l'exemple que tu donnes ([tt]CGWindowLevelForKey([aWindow level])[/tt]) ne peut pas fonctionner.
Chez moi, le résultat (sachant que aWindow est une bête fenêtre normale) retourne -2147483648, ce qui est INT_MIN.
Dernière chose, la méthode level de NSWindow fait la même chose que la fonction undocumented CGSGetWindowLevel.
Sauf que level ne fonctionne que sur des fenêtres cocoa, et que sur les objets NSWindow de sa propre appli.
Dès l'instant où tu veux connaà®tre le level des autres fenêtres (carbon ou core-graphics, et des autres applis), CGSGetWindowLevel alors devient nécessaire.
.
<br />
<br />
Je cherchais partout sur Internet la fonction qui me dirait qu'une fenêtre est miniaturisée dans le Dock, pas moyen de trouver, et je l'avais là , sur mon bon vieil Objective-Cocoa!
Merci aussi à bodysoulspirit et Philippe49 pour m'avoir amené au détour d'un post à chercher ici!
Tiens, ça mérite une tournée générale:
Je me suis réjoui trop vite
J'ai testé, sur toutes les fenêtres retournées par CGSGetWindowList
et je trouve en niveau 0:
- les fenêtres "normales"
- des fenêtres qui n'ont jamais été affichées depuis le démarrage (alertes de Snapz Pro X)
- les fenêtres placées dans le dock.
Par contre j'ai aussi d'autres fenêtres de SnapzPro en niveau 19
et le finder (en fait, un rectangle de dimension 0 en haut à gauche de l'écran), en niveau -2147483647
Pourtant, à la lecture du post de Bru, j'étais persuadé que c'était ce que je cherchais...
:)beta: