2008-12-16 84 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) 
相關問題