12
votes

Contrôle des fenêtres OSX

J'essaie de contrôler les fenêtres d'une application d'OSX étrangère à partir de ma demande. Je voudrais à 1. Déplacez les fenêtres à l'écran 2. Redimensionnez les fenêtres à l'écran 3. Modifiez la fenêtre actuellement active de l'application 4. Obtenez la fenêtre actuellement active.

(et j'aimerais faire cela soit via les API ObJC / C / C ++).

Quels sont les appels de l'API que je devrais rechercher, en considérant que j'ai les CGWindowids des fenêtres que je veux contrôler? C'est-à-dire que je m'attendrais à trouver des fonctions avec des signatures de quelque chose comme: MoveWindow (cgwindowid winid, int x, int o) , redizewindow (cgwindowid winid, intensions int largeur, int hauteur) < / Code>, ActivateWindow (CGWindowid Winid) , CGWindowID GetCurrencivatedWindowWindow () .

pour 3, j'utilise déjà setfrontProcess pour tirer un processus pour être à l'avant, mais cela ne me permet pas de sélectionner la fenêtre spécifique d'un processus s'il a plusieurs.


0 commentaires

6 Réponses :


-1
votes

Je pense que vous devriez expliquer pourquoi vous voulez faire cela. Les seuls utilitaires que je connais de cette option Déplacez toutes les fenêtres des autres applications sont des espaces et exposent, qui sont tous deux fournis par Apple. Si vous souhaitez prendre en charge un écran entier, il y a une API publique pour cela, mais en déplaçant les fenêtres d'une autre Applications méfiantes.


2 commentaires

Je veux automatiser une application tierce. Pour ce faire, je dois pouvoir obtenir l'état actuel de l'application et l'envoyer des événements de souris / clavier. ReSizeWindow m'aidera à obtenir l'état actuel à travers l'écran de gratter et qu'activateWindow est nécessaire pour pouvoir envoyer de manière fiable des événements de souris / clavier à l'application. GetCurrinyActivatedWindow Wwindow serait utilisé pour ramener la fenêtre active d'origine, de même que possible le travail d'automatisation sans inveriner autant que possible avec l'utilisateur. MoveWindow serait juste une chose «agréable à avoir» pour le développement.


OK, cela étant le cas, vous devriez examiner l'API d'accessibilité / script. Toute application de cacao reprend un certain degré de scriptabilité, ce qui peut être autant que nécessaire.



1
votes

Basé sur votre commentaire, vous pouvez le faire avec l'API d'accessibilité OS X, mais je pense que "l'accès des périphériques d'assistance" doit être activé dans les préférences d'accessibilité de l'utilisateur.

Il y a une application Shareware tierce dont le nom m'échappe au moment qui vous permet de déplacer n'importe quelle fenêtre autour (et je pense le redimensionner) avec des commandes de clavier.


1 commentaires

Oui, Mercurymovers était-ce. :-)



-1
votes

Je suis nouveau ici, cela doit donc être soumis comme une réponse au lieu d'un commentaire. J'ai écrit une application .NET ( SIMPERMINT ) Est-ce exactement dans Windows et n'est pas méfiant du tout . Placemint vous aide à organiser vos fenêtres de manière structurée définie par l'utilisateur. Tout ce qu'il fait, c'est faire des choses comme bouger ou redimensionner des fenêtres en fonction des règles définies par l'utilisateur. Quelqu'un m'a demandé si je pouvais faire un port à OSX, mais je n'ai jamais été très loin parce que je n'ai pas pu trouver une définition de l'API comme celle fournie dans Windows (appels de la DLL marshaling à user32.dll comme SetWindowPos ()).


0 commentaires

11
votes

Une façon de le faire est en effet d'utiliser les API d'accessibilité.

Une application que je développe fait tout cela pour obtenir la fenêtre avant, le chemin du document de la fenêtre avant et beaucoup d'autres attributs.

La façon dont je le fais est par AppleScript. Il peut être parfois maladroit, mais il semble être assez fiable. J'utilise AppScript pour envoyer AppleScript à partir de mon application Cocoa. Il est sûr et plus stable fil que les solutions de rechange -. Soit Pont Scripting ou NSAppleScript

Le peu difficile sera d'identifier une fenêtre en utilisant son ID de fenêtre dans AppleScript - AppleScript ne semble pas avoir une propriété ID fenêtre matchs jusqu'à CGWindowID. Cependant, vous pouvez obtenir une fenêtre que vous voulez en utilisant AppleScript.

  1. Déplacer à 100 fenêtre active, 100 XXX

  2. redimensionnement de la fenêtre d'avant-plan à 200, 300 XXX

  3. Modifier la fenêtre actuelle de l'application active XXX

  4. Fenêtre qui est actif XXX

    Il y a une application disponible pour AppScript ASTranslate qui fera tourner ce AppleScript dans le code Objective C qui appelle les commandes pertinentes dans AppScript.

    pour plus d'informations sur la façon d'obtenir la taille et les limites des fenêtres (ceux-ci sont en lecture seule pour autant que je sache) voir le Fils d'exemple d'application Grab


3 commentaires

Ces exemples de code m'ont aidé de plusieurs manières, car je veux atteindre la même chose que Sami. :) Merci beaucoup!


Pas de problème. Ce fut un plaisir d'aider - cette communauté m'a donné tant de réponses de grandes réponses à mes questions, c'était agréable de pouvoir offrir quelque chose de retour.


Existe-t-il une méthode pour simplement concentrer la fenêtre, sans accessibilty? Mon utilisation est le cas, mon application a le focus, il répertorie toutes les applications en cours d'exécution, la sélection d'une application dans cette liste se focaliser. Actuellement, si j'utilise ActivatewithOptions: Il ne pas inculquer les fenêtres minimisées, donc si toutes les fenêtres sont comprises, il ne fait rien. J'essaie donc de trouver un autre moyen de mise au point (qui uniminimizes)



1
votes

L'accessibilité doit être activée dans les préférences du système pour que cela fonctionne. C'est AppleScript, mais pourrait être utilisé dans l'objectif-C avec le pont de script.

-- Moves safari window by deltaposition
tell application "System Events"
    tell application "Safari"
        set win to first window
        set b to bounds of win
        set deltaposition to {50, 0}
        set bounds of first window to {(item 1 of b) + (item 1 of deltaposition), (item 2 of b) + (item 2 of deltaposition), (item 3 of b) + (item 1 of deltaposition), (item 4 of b) + (item 2 of deltaposition)}
    end tell
end tell


0 commentaires

2
votes

Utilisez CGWindowsCopyWindowInfo pour saisir le kcgwindowownerpid de chaque fenêtre. Ensuite, vous pouvez utiliser des "objets distribués" si vous souhaitez accéder à ObjectiveC Stuff, ou Mach RPC pour d'autres éléments. Tout cela est documenté à http://developer.apple.com

Il existe de nombreuses bonnes raisons pour vouloir envoyer des messages d'autres applications - par exemple lors du développement de nouvelles interfaces utilisateur qui ne sont ni des souris ni des claviers.


1 commentaires

Bonjour BGRI Permettez-vous de fournir un exemple de code. J'ai utilisé cgwindowscopywindowinfo pour obtenir tout le kcgwindowownerpid s mais je ne peux pas comprendre comment concentrer les fenêtres par elle.