【问题标题】:What is the trick behind "launch application holding [modifier key]"?“启动应用程序持有[修饰键]”背后的技巧是什么?
【发布时间】:2011-09-11 07:33:04
【问题描述】:

iTunes 和 Reeder(我相信还有很多其他)应用程序能够在按住 ⌥(选项)键的同时修改启动行为。我尝试查看 NSApplicationDelegate 方法,但似乎没有一个方法可以为我正在寻找的内容添加任何类型的提示。这个功能是如何实现的?

【问题讨论】:

    标签: macos cocoa


    【解决方案1】:

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

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

    (已编辑以匹配出色的答案Declaring and checking/comparing (bitmask-)enums in Objective-C 以前这是 BOOL isOptionPressed = (0 != (flags & NSAlternateKeyMask)); 但是零检查不是检查位掩码是否相等的必要条件,除非位掩码本身表示二进制中的所有零。 提供的链接提供了更多详细信息。 )

    【讨论】:

    【解决方案2】:

    Francis McGrew 的答案需要改进才能起作用,但我仍然看不到通过该途径的解决方案。上述答案无法编译。修饰符Flags需要一个实际的NSEvent指针,这不是答案所暗示的类方法。

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

    NSEvent *event = [NSApp currentEvent];
    

    但是,当从 applicationDidFinishLaunching 调用时,结果事件为零。至少在我对 Snow Leopard 的测试中是这样的。

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

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

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

    【讨论】:

    • 您说了很多但没有任何实际甚至潜在的解决方案,请尝试在未来直接回答问题
    • + (NSEventModifierFlags)modifierFlags NS_AVAILABLE_MAC(10_6);是不需要实例的类方法
    猜你喜欢
    • 1970-01-01
    • 2010-10-22
    • 2010-11-12
    • 2012-03-12
    • 2010-09-30
    • 1970-01-01
    • 2020-11-01
    • 2020-12-12
    • 1970-01-01
    相关资源
    最近更新 更多