【问题标题】:Programmatically determine .icns file for active application (OS X)以编程方式确定活动应用程序的 .icns 文件 (OS X)
【发布时间】:2011-08-30 13:00:45
【问题描述】:

问题总结:

  1. 如何在 OS X 下获取当前活动应用程序的路径? (即拥有当前关键窗口的应用程序)

  2. 据此,我需要确定该应用程序的正常关联 .icns 文件(即,当您在“应用程序”文件夹中查看该应用程序时 finder 显示的图像,以及出现你按下命令(苹果)tab键)

详细问题描述:

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

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

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

例如,safari 有一个完全不相关的名称“compass.icns”。某处必须有一个文件告诉 finder 使用什么文件 - 或者一个 api 调用来执行此操作,有人有什么想法吗? NSApplication 有 applicationIconImage 方法,它显然会返回我的应用程序的图标 - 这不是我想要的 - 据我所知,没有办法为另一个应用程序实例化 NSApplication,并且像大多数方法一样这样做没有真正意义/properties 是该应用程序私有的东西。

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

【问题讨论】:

    标签: cocoa macos operating-system


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。在提出问题后不久,我发现了 NSRunningApplication 类,它完成了我想要的大部分工作,但我现在可以看到 NSWorkspace 是一个更好的方法。干杯。
    【解决方案2】:

    你应该能够用这些方法把你想要的东西串起来:

    • -[NSWorkspace runningApplications]
    • -[NSRunningApplication 活动]
    • -[NSRunningApplication bundleURL]
    • -[NSWorkspace iconForFile:]

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

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

    【讨论】:

    • “获取 NSRunningApplication 的 bundleURL,把它变成一个路径”你说……哈!现在这就是问题......我认为这是不可能的。
    • 当然,使用 -[NSRunningApplication bundleURL],断言 [NSURL isFileURL] 为真,然后使用 -[NSURL 路径]。
    猜你喜欢
    • 1970-01-01
    • 2015-07-21
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多