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

Posted

技术标签:

【中文标题】如何在不参考 NSEvent 的情况下在 Objective-C 中获取键盘状态【英文标题】:How to get keyboard state in Objective-C without referring to NSEvent 【发布时间】:2011-08-25 00:25:36 【问题描述】:

是否可以不参考NSEvent而在Objective-C中获取键盘状态?

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

【问题讨论】:

嗯。 为什么不能参考NSEvent? 从今天开始这个问题的答案应该会有所帮助:***.com/questions/5994656/… @Grady: +[NSEvent modifierFlags] 不使用 an 事件,它使用 NSEvent 类,该类在任何包含 AppKit 的应用程序中都可用。 (如果你不使用 AppKit,为什么你需要知道键盘在做什么,这超出了我的理解。)GetCurrentKeyModifiers() 不会知道一个事件,如果它出现并咬在 a** 上——但它是碳,而且,我承认,不是最好的解决方案。如果 shpoont 详细说明为什么不能使用 NSEvent,这将对回答者有所帮助。 对不起,我看错了,我指的是 [NSApp currentEvent] ... 你说得对,GetCurrentKeyModifiers() 不是一个事件,或者真棒。 【参考方案1】:

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

if( NSCommandKeyMask & [NSEvent modifierFlags] )
    NSLog(@"Oh, yeah!");

您也可以使用Quartz Event Services 获取此信息。在这种情况下,您必须包含 ApplicationServices 框架*。 CGEventSource functions 将为您提供您从NSEvent 获得的same bitmask:

CGEventFlags theFlags;
theFlags = CGEventSourceFlagsState(kCGEventSourceStateHIDSystemState);
if( kCGEventFlagMaskCommand & theFlags )
    NSLog(@"Uh huh!");


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

【讨论】:

谢谢乔希,这正是我所需要的

以上是关于如何在不参考 NSEvent 的情况下在 Objective-C 中获取键盘状态的主要内容,如果未能解决你的问题,请参考以下文章

如何在不选择文本的情况下在 Xcode 中剪切一行?

如何在不使用对话框的情况下在操作栏上方显示视图?

如何在不使用 JNDI 的情况下在 ConnectionFactory 中指定主机、端口和通道

如何在不使用count(*)的情况下在greenplum中查找表中的行数

如何在不复制/粘贴的情况下在我的所有活动中使用这些元素?

如何在不启动模拟器的情况下在 Eclipse 中将 Android 项目编译为 .apk 文件?