如何在Swift OS X应用程序中为压力事件正确添加全局NSEvent监听器?

Fel*_*ond 7 macos cocoa nsevent swift

我是OS X编程的新手,我正在尝试编写一个能够在系统范围内捕获Force Click事件的应用程序.

基于各种来源,我写下了下面列出的代码:

var lastClickStage = -1

func checkAssistanceSettings () -> Bool {
    let checkOptPrompt = kAXTrustedCheckOptionPrompt.takeUnretainedValue() as NSString
    let options = [checkOptPrompt: true]
    let accessEnabled = AXIsProcessTrustedWithOptions(options)

    return accessEnabled == 1
}

func processForceClick(incomingEvent: NSEvent!) -> Void {
    let clickStage = incomingEvent.stage

    if clickStage == lastClickStage {
        return
    }

    if (lastClickStage == 2 && clickStage != 2) {
        lastClickStage = clickStage
        return
    }

    if (clickStage == 2 && lastClickStage != 2) {
        let applicationClicked = NSWorkspace.sharedWorkspace().frontmostApplication?.bundleIdentifier
        if (applicationClicked != nil) {
            NSLog("ForceClicked in \(applicationClicked!)!")
        }
        lastClickStage = clickStage
    }
}

func processForceClickLocally(incomingEvent: NSEvent!) -> NSEvent {
    processForceClick(incomingEvent)

    return incomingEvent
}

func applicationDidFinishLaunching(aNotification: NSNotification) {
    NSLog("\(checkAssistanceSettings())")

    NSEvent.addLocalMonitorForEventsMatchingMask(NSEventMaskFromType(NSEventType.EventTypePressure), handler: processForceClickLocally)
    NSEvent.addGlobalMonitorForEventsMatchingMask(NSEventMaskFromType(NSEventType.EventTypePressure), handler: processForceClick)
}
Run Code Online (Sandbox Code Playgroud)

当我运行我的应用程序时,本地事件监听器看起来像魅力,但全局事件监听器从不调用他的处理程序,即使XCode或特定构建的应用程序在系统设置中获得可访问性(AXIsProcessTrustedWithOptions(options)评估为"true") .

任何人都可以指出它有什么问题吗?

编辑:我发现的奇怪的东西:似乎全局监听器没有使用这个NSEventMask.例如,NSEventMask.LeftMouseDownMask没有问题.所以现在似乎问题被转换为"全局侦听器中的NSEventMask.EventMaskPressure有什么问题?".