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

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

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

【问题讨论】:

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

标签: objective-c macos keyboard


【解决方案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 的一部分。

【讨论】:

  • 谢谢乔希,这正是我所需要的
猜你喜欢
  • 2013-07-08
  • 1970-01-01
  • 2018-12-28
  • 2011-04-08
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多