2008-12-16 86 views

回答

22

这应该工作:

#!/usr/bin/python 

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

只能对豹或老虎,如果你有安装PyObjC和发生在一个行权蟒蛇二进制(不是这样的点,如果你已经安装了通用MacPython,你可能希望在Tiger上做)。但是用Peter的方式来做这件事可能会快很多,因为从AppKit导入任何东西需要一段时间,或者更确切地说,在Python过程中首次从AppKit导入某些东西需要一段时间。

如果您在PyObjC应用程序中需要这样的内容,我所描述的将会非常快速,因为您只会遇到一次导入AppKit的延迟。如果你需要这个作为一个命令行工具,你会注意到性能受到影响。如果这与你有关,那么你最好使用Peter的代码作为起点在Xcode中构建一个10行的基础命令行工具。

6

首先,您想要窗口还是应用程序名称?这不是Windows - Mac OS X上的应用程序进程可以有多个窗口。 (此外,Windows已经有几年了,尽管我不知道API是什么样子的。)

二,碳还是可可?

获取活动窗口可可:

window = NSApp.mainWindow() 

要在可可得到你的进程的名称:

appName = NSProcessInfo.processInfo().processName() 

编辑:哦,我想我知道你想要什么。最前面的过程的名称,对吗?

我不认为有办法做到这一点可可,但在这里是如何做到这一点在中碳C:

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

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

记住CFRelease(processName)当你用它做。

我不确定在Python中看起来像什么,或者甚至可能。 Python没有指针,这使得棘手。我知道PyObjC会将后面的参数转换为到err, processName = CopyProcessName(…),但是Carbon绑定并不依赖于PyObjC(它们是Python 2的核心部分),我不确定你对PSN做了什么无论哪种方式。

+0

我们需要导入什么来获取NSApp和NSProcessInto? – GreenAsJade 2014-01-26 21:59:46

+0

@GreenAsJade:按照Dirk的回答,推测可能是Foundation和AppKit。 – 2014-01-26 22:34:14

1

我需要Python脚本中的当前最前面的应用程序,它可以很好地在我的屏幕上排列窗口(请参阅move_window)。

当然,完整的功劳归功于彼得!但这里是完整的程序:

#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); 
} 

建立与gcc -framework Carbon filename.c

+1

这是python的答案吗? – GreenAsJade 2014-01-26 21:56:47

12

在接受答案的方法,OS X 10.7以上版本已被否决。目前推荐的版本如下:

from AppKit import NSWorkspace 
active_app_name = NSWorkspace.sharedWorkspace().frontmostApplication().localizedName() 
print(active_app_name) 
相关问题