Программно определить файл .icns для активного приложения (OSX) - PullRequest
1 голос
/ 22 мая 2011

Вопрос Резюме:

1) как я могу получить путь к текущему активному приложению под OSX? (т.е. приложение, которому принадлежит текущее окно ключа)

2) из ​​этого мне нужно определить обычно связанный файл .icns для этого приложения (т. Е. Изображение, которое видоискатель показывает, когда вы смотрите на это приложение в папке «Приложения» и в списке приложений, который появляется, когда вы нажмите клавишу команды (яблоко) Tab *

Подробное описание вопроса:

Я разрабатываю панель утилит OSX (плавающее окно), которая должна отображать имя и изображение значка для текущего приложения (например, приложения, которому принадлежит окно, которое в данный момент является «ключом».

1) Мне нужен какой-то способ программного определения «пути к папке .app» приложения, которое в настоящее время является основным и ключевым. Это может быть либо через обратный вызов уведомления, либо что-то, что я могу опрашивать по таймеру и запускать свои собственные обратные вызовы.

2) Я вижу, что найти файлы .icns вручную в папке XXX.app/Resources довольно легко, однако проблема в том, что в этой папке иногда находится более 1 файла .icns, и я не вижу простого способа определить только из имени файла правильную иконку, обычно ассоциируемую с приложением - хотя многие приложения используют то же имя, что и приложение (с расширением icns), некоторые - нет.

Например,

safari имеет совершенно не связанное имя "compass.icns". где-то должен быть файл, который сообщает Finder, какой файл использовать - или вызов API для этого, у кого-нибудь есть идеи? NSApplication имеет метод applicationIconImage, который, очевидно, возвращает значок для МОЕ приложения - это не то, что я хочу - насколько я знаю, нет никакого способа создания экземпляра NSApplication для другого приложения, и не было бы никакого реального смысла делать это, как большинство методов / свойства - это вещи, которые являются частными для этого приложения.

что бы это ни стоило, я портирую утилиту Windows на OSX - если бы я делал это под Windows, я бы использовал GetWindowProcessID (GetForegroundWindow)), и использовал это, чтобы определить путь к приложению, и извлечь значок из что с помощью LoadIcon

Ответы [ 2 ]

4 голосов
/ 22 мая 2011

Все эти методы находятся в классе NSWorkspace.Вы можете получить активное приложение, а также его изображение значка (без файла icns).Проверьте документацию для вышеупомянутого класса, и все это должно быть понятно вам:

NSDictionary *activeAppDict = [[NSWorkspace sharedWorkspace] activeApplication];
NSString *activeApplicationPath = [activeAppDict valueForKey:@"NSApplicationPath"];
NSImage *activeAppImage = [[NSWorkspace sharedWorkspace] iconForFile:activeApplicationPath];
1 голос
/ 22 мая 2011

Вы должны быть в состоянии связать то, что вы хотите вместе с этими методами:

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

Сначала получите самое переднее приложение, перебирая запущенные приложения и выбирая активное *. Получите bundleURL для приложения NSRunningApplication, превратите его в путь и передайте его в [NSWorkspace iconForFile:]. Теперь у вас есть NSImage для самого переднего приложения.

* В документации сказано, что активное приложение - самое переднее, но я думаю, что оно действительно означает ключ, поскольку я не ожидаю, что оно вернет ДА ​​для приложения, которое было первым, но не ключевое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...