如何在我的应用获得焦点时收听NSEvents,而不受哪个窗口处于活动状态的影响?我不想监听系统范围内的事件,我只想在我的应用程序获得焦点时监听单个和/或修改后的击键,但我能找到的所有示例都是从NSWindow或NSView监听NSEvents。我的应用程序有多个窗口,我希望在其中任何一个窗口处于焦点状态时捕获所有击键。
x4shl7ld1#
这是可行的,但对这个问题来说有点过头了。正确的方法见 Alexandria 的答案。覆盖NSApplication.sendEvent。这是应用程序中所有事件的中央调度方法。您可以确定您关心的事件,然后使用super使用它们或发送它们。这是NSApplication中的一个文档覆盖点。这不是一个黑客攻击。注意,这需要对NSApplication本身进行子类化,而不是由应用程序委托来处理,关于在Swift中对NSApplication进行子类化的说明,请参见Subclass NSApplication in Swift。答案有点乱,关键是设置NSPrincipalClass。)有关更多技术细节,请参见Cocoa Event Handling Guide,它涵盖了整个架构。
NSApplication.sendEvent
super
xqnpmsa82#
看起来NSEvent.addLocalMonitorForEvents(matching:handler:) API正是您要寻找的。
NSEvent.addLocalMonitorForEvents(matching:handler:)
2条答案
按热度按时间x4shl7ld1#
这是可行的,但对这个问题来说有点过头了。正确的方法见 Alexandria 的答案。
覆盖
NSApplication.sendEvent
。这是应用程序中所有事件的中央调度方法。您可以确定您关心的事件,然后使用super
使用它们或发送它们。这是NSApplication中的一个文档覆盖点。这不是一个黑客攻击。注意,这需要对NSApplication本身进行子类化,而不是由应用程序委托来处理,关于在Swift中对NSApplication进行子类化的说明,请参见Subclass NSApplication in Swift。答案有点乱,关键是设置NSPrincipalClass。)
有关更多技术细节,请参见Cocoa Event Handling Guide,它涵盖了整个架构。
xqnpmsa82#
看起来
NSEvent.addLocalMonitorForEvents(matching:handler:)
API正是您要寻找的。