【发布时间】:2011-09-11 07:33:04
【问题描述】:
iTunes 和 Reeder(我相信还有很多其他)应用程序能够在按住 ⌥(选项)键的同时修改启动行为。我尝试查看 NSApplicationDelegate 方法,但似乎没有一个方法可以为我正在寻找的内容添加任何类型的提示。这个功能是如何实现的?
【问题讨论】:
iTunes 和 Reeder(我相信还有很多其他)应用程序能够在按住 ⌥(选项)键的同时修改启动行为。我尝试查看 NSApplicationDelegate 方法,但似乎没有一个方法可以为我正在寻找的内容添加任何类型的提示。这个功能是如何实现的?
【问题讨论】:
在您的应用程序委托的 applicationDidFinishLaunching: 方法中
NSUInteger flags = ([NSEvent modifierFlags] & NSDeviceIndependentModifierFlagsMask);
BOOL isOptionPressed = (flags == NSAlternateKeyMask);
(已编辑以匹配出色的答案Declaring and checking/comparing (bitmask-)enums in Objective-C
以前这是
BOOL isOptionPressed = (0 != (flags & NSAlternateKeyMask));
但是零检查不是检查位掩码是否相等的必要条件,除非位掩码本身表示二进制中的所有零。
提供的链接提供了更多详细信息。
)
【讨论】:
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
【讨论】: