应用程序设置为后台时停止工作

问题描述 投票:1回答:1

当窗口在前台打开时,代码工作正常,当我按空格键时,鼠标按预期移动,但是当我移动到另一个应用程序并按空格键时,鼠标不再按预期移动按键,即使将应用程序设置为背景,如何使应用程序保持正常工作

import Cocoa

class ViewController: NSViewController {       
    var timer: Timer!       
    @objc func movethemouse() {       
        let mouseLocx = NSEvent.mouseLocation.x       
        let mouseLocy = NSEvent.mouseLocation.y       
        let screenH = NSScreen.main?.frame.height       
        let deltaX = CGFloat(Int(1))       
        let deltaY = CGFloat(Int(1))       
        let newLoc = CGPoint(x: mouseLocx + deltaX , y: screenH! - mouseLocy - deltaY )       
        CGDisplayMoveCursorToPoint(CGMainDisplayID(), newLoc)
    }       
    override func viewDidLoad() {       
        super.viewDidLoad()       
        // Do any additional setup after loading the view.       
    }       
    override func viewDidAppear() {       
        view.window?.makeFirstResponder(self)       
    }       
    override var acceptsFirstResponder : Bool {       
        return true       
    }       
    var count3=0       
    var flag = false       
    override func keyDown(with event: NSEvent) {       
        if (event.keyCode == 49){       
            flag = true       
            if count3 == 0 {       
                timer = Timer.scheduledTimer(timeInterval: 0.001, target:self, selector: #selector(ViewController.movethemouse), userInfo: nil, repeats:true)       
            print(event)       
            }       
           count3 += 1       
        }       
    }       
    override func keyUp(with event: NSEvent) {       
        print(event)       
        if (event.keyCode == 49) {       
            if flag {       
                timer.invalidate()       
                count3 = 0       
                print(event)       
            }       
        }       
    }       
}       
swift macos cocoa
1个回答
1
投票

您需要捕获系统范围的事件。这里有一些示例代码可以获取系统中的所有内容。请注意,您必须为XCode(在开发期间)或您的应用程序(在XCode外部运行)启用辅助模式才能使其正常工作。

func applicationDidFinishLaunching(_ aNotification: Notification) {
    if getAccessibility() {
        snarfKeys()
    }
    // etc...
}

func getAccessibility() -> Bool {
    let trusted = AXIsProcessTrusted()
    if !trusted {
        print("process is not trusted")
    }
    return trusted
}

func snarfKeys() {
    NSEvent.addGlobalMonitorForEvents(matching: .keyUp, handler: keyPress)
    NSEvent.addGlobalMonitorForEvents(matching: .leftMouseUp, handler: mousePress)
}

snarfKeys发挥了神奇作用,但如上所述,在代码中,需要信任该进程才能添加全局事件监视。

© www.soinside.com 2019 - 2024. All rights reserved.