【问题标题】:Objective-C/Cocoa: Detect all keypressesObjective-C/Cocoa:检测所有按键
【发布时间】:2012-04-29 01:35:31
【问题描述】:

是否可以在用户每次按键时运行一个方法。基本上我想在按下一个键时发出类似 iPhone 或 iPad 上的声音。 我不想在我的窗口或某个控件中检测按键,我想检测所有按键(例如当他们在 Safari 中键入时或其他什么时。我不需要知道关键是。

谢谢

【问题讨论】:

标签: objective-c macos cocoa keypress


【解决方案1】:

使用此处记录的CGEventTapCreate

https://developer.apple.com/library/mac/#documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html

或使用此处记录的 NSEvents addGlobalMonitorForEventsMatchingMask:handler:

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/nsevent_Class/Reference/Reference.html

NSEvent 示例:

[NSEvent addGlobalMonitorForEventsMatchingMask:(NSKeyDownMask) handler:^(NSEvent *event){
    [self keyWasPressedFunction: event];
    //Or just put your code here
}];

我会说 NSEvents 更容易......

注意:

出于安全原因,Apple 要求您在“系统偏好设置”中打开“启用辅助设备的访问权限”,以便使用上述方法。

【讨论】:

  • @Oliver:好的,添加了 NSEvent 示例,CGEventTaps 要复杂得多,并且对于您尝试做的事情不是必需的......
【解决方案2】:

您可以通过 Quartz 事件轻按来非常接近,但为了安全起见,即使有一些按键也无法检测到。

如果您告诉我们您心目中的更广泛目标,我们可以提出替代方案。您是否正在尝试为您的应用程序建立一个全局热键?您是在编写键盘记录程序还是恶意软件?什么?

【讨论】:

  • 我想做的只是制作一个应用程序,当他们按下某个键时,它会播放 iPad 或 iPhone 的按键噪音。
  • 那么你应该看看事件水龙头。同样,出于安全原因,并非所有按键都可以被检测到(例如,当使用密码字段时,您无法获取按键事件。)
【解决方案3】:

使用NSEvents addGlobalMonitorForEventsMatchingMask:handler:

applicationDidFinishLaunching 中添加以下代码,构建并运行!

[NSEvent addGlobalMonitorForEventsMatchingMask:(NSKeyDownMask) handler:^(NSEvent *event){
NSLog(@"%@", event.characters);
}];

Apple 要求您在“系统偏好设置”中启用“启用辅助设备访问”。

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/nsevent_Class/Reference/Reference.html

【讨论】:

  • 别忘了在applicationWillClose函数中解除分配监视器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
  • 2011-09-07
  • 2011-08-26
  • 2011-01-05
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多