В чем заключается трюк, стоящий за "запуском приложения-приложения [ключ-модификатор]"?

iTunes и Reeder (и я уверен, что многие другие) приложения имеют возможность изменять поведение при запуске, когда они запускаются, удерживая клавишу ⌥ (опция). Я пробовал искать методы NSApplicationDelegate, но никто, кажется, не добавляет никакого намека на то, что я ищу. Как достигается эта функциональность?

Ответы

Ответ 1

В приложении приложение applicationDidFinishLaunching: method

NSUInteger flags = ([NSEvent modifierFlags] & NSDeviceIndependentModifierFlagsMask);

BOOL isOptionPressed = (flags == NSAlternateKeyMask);

(Отредактировано для соответствия удивительному ответу Объявление и проверка/сравнение (битмаска-) перечислений в Objective-C Раньше это было BOOL isOptionPressed = (0 != (flags & NSAlternateKeyMask)); Но проверка нуля не нужна, чтобы проверить, является ли битовая маска для равенства, если сама битовая маска не представляет все нули в двоичном формате. Предоставленная ссылка дает более подробную информацию. )

Ответ 2

Ответ Фрэнсиса МакГрю требует улучшения, прежде чем он сможет работать, но я по-прежнему не вижу решения по этому маршруту. Ответ, как указано, не компилируется. Фактический указатель NSEvent необходим для модификаторовFlags, который не является методом класса, как подсказывает ответ.

Можно было бы надеяться, что необходимое событие может быть получено следующим.

NSEvent *event = [NSApp currentEvent];

Однако при вызове из приложенияDidFinishLaunching результирующее событие равно nil. По крайней мере, это верно в моих тестах на Snow Leopard.

applicationDidFinishLaunching имеет аргумент NSNotification, но я не знаю, как его использовать.

Я нашел аналогичный вопрос на cocobuilder.com с 2007 года, и ответ в основном называет функцию GetCurrentKeyModifiers с углеродной функцией и преобразовывает углеродные флаги в форму cocoa.

См. http://www.cocoabuilder.com/archive/cocoa/176882-detecting-modifier-keys-at-launch.html