有没有办法在Mac OS X上使用Python在给定时间找到当前活动窗口的应用程序名称?
这应该工作:
#!/usr/bin/python from AppKit import NSWorkspace activeAppName = NSWorkspace.sharedWorkspace().activeApplication()['NSApplicationName'] print activeAppName
只适用于Leopard,或者如果安装了PyObjC,就可以使用Tiger,并且碰巧指向第一行中的正确python二进制文件(如果你安装了通用的MacPython,那么你可能想要对Tiger进行操作).但是Peter用Carbon的方式回答这个问题可能要快一些,因为在Python中从AppKit导入任何内容需要一段时间,或者更准确地说,在Python进程中第一次从AppKit导入内容需要一段时间.
如果你需要在PyObjC应用程序中使用它,我所描述的将会非常快速地工作,因为你只会遇到导入AppKit一次的延迟.如果您需要它作为命令行工具,您会注意到性能受到影响.如果这与您相关,那么最好使用Peter的代码作为起点,在Xcode中构建一个10行的Foundation命令行工具.
接受的答案中的方法在OS X 10.7+中已弃用.目前推荐的版本如下:
from AppKit import NSWorkspace active_app_name = NSWorkspace.sharedWorkspace().frontmostApplication().localizedName() print(active_app_name)
首先,您想要窗口或应用程序名称吗?这不是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做了什么.