以编程方式确定活动应用程序(OSX)的.icns文件

时间:2011-05-22 10:00:44

标签: cocoa macos operating-system

问题摘要:

1)如何在OSX下获取当前活动应用程序的路径? (即拥有当前密钥窗口的应用程序)

2)从中,我需要确定该应用程序的正常关联的.icns文件(即,当您在“Applications”文件夹中查看该应用程序时,以及在您出现的应用程序列表中,查找器显示的图像按命令(苹果)标签键)

详细问题描述:

我正在开发一个OSX实用工具栏(浮动窗口),需要显示当前应用程序的名称和图标图像(例如,拥有当前“密钥”窗口的应用程序。

1)我需要某种方式以编程方式确定当前主要和应用程序的应用程序的“.app文件夹的路径”。键。这可以通过通知回调,或者我可以在计时器上轮询并触发我自己的回调。

2)我可以看到在XXX.app/Resources文件夹中手动查找.icns文件相对容易,但问题是该文件夹中有时有超过1个.icns文件 - 我看不出简单的方法从文件名中确定哪个是通常与应用程序相关联的正确图标 - 虽然许多应用程序使用与应用程序相同的名称(带有icns扩展名),但有些应用程序却没有。

例如, safari有一个完全不相关的名称“compass.icns”。某个地方必须有一个文件告诉finder要使用哪个文件 - 或者api调用这样做,任何人都有任何想法? NSApplication有applicationIconImage方法,它显然会返回MY应用程序的图标 - 这不是我想要的 - 据我所知,没有办法将NSApplication实例化为另一个应用程序,并且这样做与大多数方法一样没有任何意义/ properties是该应用程序专用的东西。

为了它的价值,我正在将一个Windows实用程序移植到OSX - 如果我在Windows下执行此操作,我将使用GetWindowProcessID(GetForegroundWindow)),并使用它来确定应用程序的路径,并从中提取图标使用LoadIcon

2 个答案:

答案 0 :(得分:4)

所有这些方法都驻留在NSWorkspace类中。您可以获取活动应用程序及其图标图像(没有icns文件)。检查上述课程的文档,这一切都应该清楚:

NSDictionary *activeAppDict = [[NSWorkspace sharedWorkspace] activeApplication];
NSString *activeApplicationPath = [activeAppDict valueForKey:@"NSApplicationPath"];
NSImage *activeAppImage = [[NSWorkspace sharedWorkspace] iconForFile:activeApplicationPath];

答案 1 :(得分:1)

您应该能够将这些方法与这些方法串联起来:

  • - [NSWorkspace runningApplications]
  • - [NSRunningApplication active]
  • - [NSRunningApplication bundleURL]
  • - [NSWorkspace iconForFile:]

首先通过循环运行的应用程序并选择活动的应用程序来获得最前面的应用程序*。获取NSRunningApplication的bundleURL,将其转换为路径,并将其传递给 - [NSWorkspace iconForFile:]。现在你已经为最前面的应用程序提供了一个NSImage。

*文档说活动应用程序是最重要的应用程序,但我认为它确实意味着关键,因为我不希望它为最前面但不是关键的应用程序返回YES。