使用Python在Mac OS X中查找当前活动窗口

时间:2008-12-16 22:33:03

标签: python objective-c cocoa macos

有没有办法在Mac OS X上使用Python在给定时间找到当前活动窗口的应用程序名称?

4 个答案:

答案 0 :(得分:25)

这应该有效:

#!/usr/bin/python

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

只适用于Leopard或虎牌,如果你安装了PyObjC并碰巧指向第一行的正确python二进制文件(如果你安装了通用的MacPython,那么你可能想要对Tiger进行操作) )。但是Peter用Carbon的方式回答这个问题可能要快得多,因为在Python中从AppKit导入任何内容需要一段时间,或者更准确地说,在Python进程中第一次从AppKit导入内容需要一段时间。 / p>

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

答案 1 :(得分:13)

在OS X 10.7+中已弃用已接受答案中的方法。目前推荐的版本如下:

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

答案 2 :(得分:6)

首先,您想要窗口或应用程序名称吗?这不是Windows- Mac OS X上的应用程序进程可以有多个窗口。 (此外,Windows已经存在了几年,虽然我不知道API的用途是什么。)

第二,碳或可可?

在Cocoa中获取活动窗口:

window = NSApp.mainWindow()

在Cocoa中获取进程的名称:

appName = NSProcessInfo.processInfo().processName()

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

我认为在Cocoa中没有办法做到这一点,但这里是如何在C中的Carbon中做到这一点:

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

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

完成后请记得CFRelease(processName)

我不确定在Python中会是什么样子,或者甚至可能。 Python没有指针,这使得这很棘手。

我知道PyObjC会将后一个参数转换为CopyProcessNameerr, processName = CopyProcessName(…),但Carbon绑定不依赖于PyObjC(它们是核心Python 2的一部分),而我不是确定你对PSN做了什么。

答案 3 :(得分: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构建