有没有办法在Mac OS X上使用Python在给定时间找到当前活动窗口的应用程序名称?
答案 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会将后一个参数转换为CopyProcessName
到err, 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
构建