当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用Python在MacOSX中查找当前活动窗口》经验,为你挑选了3个好方法。

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



1> Dirk Stoop..:

这应该工作:

#!/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命令行工具.



2> 小智..:

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

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



3> Peter Hosey..:

首先,您想要窗口或应用程序名称吗?这不是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做了什么.

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有