Swift:将键击转发到不同的进程

时间:2017-11-29 19:11:29

标签: swift macos cocoa

我正在尝试编写一个应用程序,使用其processID将其某个TextField上的按键转发到另一个进程。

我听到的代码(下面)在按下按键时(现在,所有按键)都很有效,但问题来自于将事件(keyDown / keyUp)转发到另一个进程。

我尝试过的事情:

  1. CGEvent.postToPid:不起作用(没有发送到其他进程)
  2. CGEvent.postToPSN:无法让它工作,因为它需要将Process Serial Number作为UnsafeMutableRawPointer(不是我知道如何让PSN首先出现)
  3. 手动创建CGEvent,然后尝试1.和2.
  4. 阅读关于课程及其功能的文档(它们似乎并不那么受欢迎)
  5. 非常感谢任何帮助。

    import Cocoa
    
    class ViewController: NSViewController {
      var pid: Int32 = 12345
    
      override func viewDidLoad() {
          super.viewDidLoad()
    
          NSEvent.addLocalMonitorForEvents(matching: .keyDown) {
              (event) -> NSEvent? in
              self.keyDown(with: event)
              return event
          }
    
          // For some reason, keyUp is triggered twice
          NSEvent.addLocalMonitorForEvents(matching: .keyUp) {
              (event) -> NSEvent? in
              self.keyUp(with: event)
              return event
          }
      }
    
      override func keyDown(with event: NSEvent) {
          print("Down " + String(event.keyCode))
          var cgEvent = event.cgEvent
          cgEvent?.postToPid(pid)
      }
    
      override func keyUp(with event: NSEvent) {
          print("Up   " + String(event.keyCode))
          var cgEvent = event.cgEvent
          cgEvent?.postToPid(pid)
      }
    }
    

1 个答案:

答案 0 :(得分:0)

其中一条评论表明权限可能是原因,而且是。

我的问题通过转到我的项目的功能部分并禁用默认启用的应用程序沙盒来解决。

请注意,App Sandboxing是您的应用在App Store上的要求(reference