2017-12-30 41 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

他のAppがフォアグラウンドで既にキーボードイベントを処理しているため、あなたのAppはイベントを取得しないと思います。 '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)の[ Cocoa Event Handling Guide](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魔法を行いますが、コードの上とで述べたように、プロセスは、グローバルイベントの監視を追加できるように、信頼する必要があります。

関連する問題