2017-12-30 10 views
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)  
      }  
     }  
    }  
}  
+0

다른 앱이 포 그라운드에서 이미 키보드 이벤트를 처리하기 때문에 앱에 이벤트가 발생하지 않는다고 생각합니다. 'keyDown'과'keyUp'가 실제로 호출되는지를보기 위해 약간의 로깅을 추가 했습니까? – mschmidt

+0

앱이 백그라운드에 있으면 이벤트 KeyDown 및 KeyUp이 더 이상 호출되지 않습니다. 그것이 해결하려고하는 것입니다. 응용 프로그램이 백그라운드에서 실행되는 동안 어떻게 활성 상태로 유지합니까? – DeveloperSwift11

+1

키 및 마우스 이벤트가 가장 앞쪽에있는 앱으로 이동합니다. [이벤트 모니터링] (https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/EventOverview/MonitoringEvents./MonitoringEvents.html#//apple_ref/doc/uid/10000060i-CH15-SW3)의 [ 코코아 이벤트 처리 가이드] (https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/EventOverview/Introduction/Introduction.html#//apple_ref/doc/uid/10000060i-CH1-SW1). – Willeke

답변

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 마법을 수행하지만 위 코드에서 언급 한 바와 같이, 프로세스가 글로벌 이벤트 모니터링을 추가 할 수 있도록 신뢰해야합니다.

관련 문제