如何在不参考NSEvent的情况下在Objective-C中获取键盘状态

shp*_*ont 8 keyboard macos objective-c

是否有可能在没有引用的情况下在Objective-C中获得键盘状态NSEvent

一般情况下,我不能使用NSResponder类似的方法,-[NSResponder flagsChanged:]但我需要知道当前是否按下了Command键.

Jos*_*ell 18

我仍然想知道为什么你不能使用NSEvent,但我还是会回答这个问题.也许你正在构建一个"命令行工具"并且只与基金会相关联?您将不得不至少包含一个框架.如果你想链接AppKit,你可以(正如我在评论中提到的)使用+[NSEvent modifierFlags]; 这是一个类方法NSEvent,因此您可以在任何地方使用它,而无需访问单个事件,以将修饰符键的当前状态作为位掩码.文档解释了位掩码含义.

if( NSCommandKeyMask & [NSEvent modifierFlags] ){
    NSLog(@"Oh, yeah!");
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用Quartz Event Services获取此信息.在这种情况下,您必须包含ApplicationServices框架*.该CGEventSource功能会给你同样的位掩码你得到NSEvent:

CGEventFlags theFlags;
theFlags = CGEventSourceFlagsState(kCGEventSourceStateHIDSystemState);
if( kCGEventFlagMaskCommand & theFlags ){
    NSLog(@"Uh huh!");
}
Run Code Online (Sandbox Code Playgroud)

*如果您实际上正在编写Cocoa应用程序,那么这已经包含在内了 - 它是Quartz的一部分.