2008-12-16 6 views

Répondre

22

Cela devrait fonctionner:

#!/usr/bin/python 

from AppKit import NSWorkspace 
activeAppName = NSWorkspace.sharedWorkspace().activeApplication()['NSApplicationName'] 
print activeAppName 

fonctionne que sur Leopard ou Tiger si vous avez PyObjC installé et arrive à pointer vers le binaire python droite ligne un (pas le cas si vous avez installé universel MacPython, que vous voudriez probablement faire sur Tiger). Mais la réponse de Peter avec la méthode Carbon sera probablement un peu plus rapide, car importer quelque chose d'AppKit en Python prend du temps, ou plus exactement, importer quelque chose d'AppKit pour la première fois dans un processus Python prend un certain temps.

Si vous en avez besoin dans une application PyObjC, ce que je décris fonctionnera très bien et rapidement, puisque vous ne rencontrez qu'une seule fois le retard d'importation d'AppKit. Si vous avez besoin de cela pour fonctionner en tant qu'outil de ligne de commande, vous remarquerez que les performances ont été atteintes. Si cela vous intéresse, il est probablement préférable de construire un outil de ligne de commande de 10 lignes dans Xcode en utilisant le code de Peter comme point de départ.

6

Tout d'abord, voulez-vous la fenêtre ou le nom de l'application? Ce n'est pas Windows - un processus d'application sur Mac OS X peut avoir plusieurs fenêtres. (En outre, cela a également été vrai pour Windows depuis quelques années maintenant, bien que je n'ai aucune idée de ce que l'API ressemble pour cela.)

Deuxièmement, carbone ou cacao?

Pour obtenir la fenêtre active à Cocoa:

window = NSApp.mainWindow() 

Pour obtenir le nom de votre processus à Cocoa:

appName = NSProcessInfo.processInfo().processName() 

Edit: Oh, je pense que je sais ce que vous voulez. Le nom du processus le plus en avant, non?

Je ne pense pas qu'il y ait une façon de le faire à Cocoa, mais voici comment le faire en carbone dans C:

ProcessSerialNumber psn = { 0L, 0L }; 
OSStatus err = GetFrontProcess(&psn); 
/*error check*/ 

CFStringRef processName = NULL; 
err = CopyProcessName(&psn, &processName); 
/*error check*/ 

N'oubliez pas de CFRelease(processName) lorsque vous avez terminé avec elle.

Je ne suis pas sûr de ce que cela va ressembler en Python, ou si c'est même possible. Python n'a pas de pointeurs, ce qui rend cette tâche difficile.

Je sais PyObjC se traduirait par ce dernier argument CopyProcessName en err, processName = CopyProcessName(…), mais les liaisons de carbone ne reposent pas sur PyObjC (ils font partie du noyau Python 2), et je ne sais pas ce que vous faites sur le PSN d'une manière ou d'une autre.

+0

Que devons-nous importer pour obtenir NSApp et NSProcessInto? – GreenAsJade

+0

@ GreenAsJade: En allant par la réponse de Dirk, vraisemblablement Foundation et AppKit. –

1

J'avais besoin de l'application frontale courante dans un script Python qui arrange bien les fenêtres sur mon écran (voir move_window).

Bien sûr, le crédit complet revient à Peter! Mais voici le programme complet:

#include <Carbon/Carbon.h> 

int main(int, char) { 
    ProcessSerialNumber psn = { 0L, 0L }; 
    OSStatus err = GetFrontProcess(&psn); 

    CFStringRef processName = NULL; 
    err = CopyProcessName(&psn, &processName); 
    printf("%s\n", CFStringGetCStringPtr(processName, NULL)); 
    CFRelease(processName); 
} 

Construire avec gcc -framework Carbon filename.c

+1

Comment est-ce une réponse pour python? – GreenAsJade

+0

Également pas pour Python, mais pour la nouvelle automatisation JavaScript de Yosemite, vous pouvez utiliser '$ .NSWorkspace.sharedWorkspace.activeApplication.objectForKey ('NSApplicationName') .UTF8String;'. Vous devez d'abord importer ceci: 'ObjC.import ('AppKit')'. – SirVer

12

La méthode dans la réponse acceptée a été dépréciée dans OS X 10.7+.La version actuelle recommandée est la suivante:

from AppKit import NSWorkspace 
active_app_name = NSWorkspace.sharedWorkspace().frontmostApplication().localizedName() 
print(active_app_name) 
+0

Cela aide vraiment! Comment pouvons-nous obtenir le titre de la fenêtre active? –

+0

Je sais qu'il est possible de le faire en utilisant AppleScript (en l'appelant via osascript en Python), mais à ma connaissance, il n'y a pas de moyen simple de le faire en Python. Voici un lien pour vérifier les informations que vous pouvez récupérer en utilisant Cocoa: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSWorkspace_Class/index.html#//apple_ref/occ/instm/NSWorkspace/frontmostApplication – kmundnic

+0

À l'origine, nous utilisions AppleScript pour obtenir le titre de la fenêtre en cours, ce qui fonctionnait parfaitement. Mais cela n'a pas fonctionné si nous avons signé l'application. Et puis j'ai trouvé une API native dans Quartz pour le faire, et cela a résolu notre problème. –

Questions connexes