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

Moi*_*oiz 20 python macos cocoa objective-c

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

Dir*_*oop 25

这应该工作:

#!/usr/bin/python

from AppKit import NSWorkspace
activeAppName = NSWorkspace.sharedWorkspace().activeApplication()['NSApplicationName']
print activeAppName
Run Code Online (Sandbox Code Playgroud)

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

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


小智 15

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

from AppKit import NSWorkspace
active_app_name = NSWorkspace.sharedWorkspace().frontmostApplication().localizedName()
print(active_app_name)
Run Code Online (Sandbox Code Playgroud)


Pet*_*sey 6

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

第二,碳还是可可?

要在Cocoa中获取活动窗口:

window = NSApp.mainWindow()
Run Code Online (Sandbox Code Playgroud)

要在Cocoa中获取进程的名称:

appName = NSProcessInfo.processInfo().processName()
Run Code Online (Sandbox Code Playgroud)

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

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

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

CFStringRef processName = NULL;
err = CopyProcessName(&psn, &processName);
/*error check*/
Run Code Online (Sandbox Code Playgroud)

记得CFRelease(processName)当你完成它.

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

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