“启动应用程序持有[修饰键]”背后的诀窍是什么?

时间:2011-09-11 07:33:05

标签: macos cocoa

iTunes和Reeder(我相信很多其他的)应用程序能够在按住⌥(选项)键的同时修改启动行为。我试着查看NSApplicationDelegate方法,但似乎没有任何暗示我正在寻找的东西。这个功能是如何实现的?

2 个答案:

答案 0 :(得分:23)

在您的应用程序委托的applicationDidFinishLaunching:方法

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

BOOL isOptionPressed = (flags == NSAlternateKeyMask);

(编辑为匹配真棒答案Declaring and checking/comparing (bitmask-)enums in Objective-C 以前这是 BOOL isOptionPressed = (0 != (flags & NSAlternateKeyMask)); 但是,除非位掩码本身表示二进制中的全零,否则不需要进行零检查来检查相等的掩码是否相等。 提供的链接提供了更多细节。 )

答案 1 :(得分:1)

Francis McGrew的答案需要改进才能发挥作用,但我仍然看不到通过这条路线的解决方案。如上所述的答案没有编译。 modifierFlags需要一个实际的NSEvent指针,这不是一个类方法,正如答案所暗示的那样。

人们希望通过以下方式获得所需的事件。

NSEvent *event = [NSApp currentEvent];

然而,当从applicationDidFinishLaunching调用时,结果事件为nil。至少在我对Snow Leopard的测试中也是如此。

applicationDidFinishLaunching有一个NSNotification参数,但我不知道如何使用它。

我在2007年的cocobuilder.com上发现了一个类似的问题,其答案基本上是调用碳函数GetCurrentKeyModifiers并将碳标志转换为可可形式。

请参阅http://www.cocoabuilder.com/archive/cocoa/176882-detecting-modifier-keys-at-launch.html