通过进程ID将KeyEvent发送到目标窗口

时间:2017-11-04 22:12:50

标签: swift cocoa events macos-sierra

我需要创建一个键事件(cmd + r用于浏览器窗口的刷新)并传递我尝试定位的窗口的进程ID。让我们说

    let customEvent = NSEvent.keyEvent(with: NSEvent.EventType.keyUp,
                     location: NSPoint(),
                     modifierFlags: NSEvent.ModifierFlags.command,
                     timestamp: TimeInterval(),
                     windowNumber: 0,
                     context: NSGraphicsContext(),
                     characters: "",
                     charactersIgnoringModifiers: "",
                     isARepeat: false, 
                     keyCode: 0x0F);


    let cgEvent = customEvent!.cgEvent

    cgEvent!.postToPid(688) // I want to post to a process with pid 688

1 个答案:

答案 0 :(得分:0)

在您的情况下,您需要做的就是在 CGEvent 实例上调用 postToPid ,并将PID作为参数传递:

let cgEvent = customEvent!.cgEvent
cgEvent?.postToPid(168) 

修改
您的代码无法正常工作,因为您只是发送了一个密钥启动事件,而不是CMD + R.您可以在AppleScript中轻松完成此操作。请参阅此问题:Mac: reloading document in Chrome or Firefox?

修改2

没有AppleScript,我就是这样做的:

let src = CGEventSource(stateID: .hidSystemState)
if let event = CGEvent(keyboardEventSource: src, virtualKey: 0x0f, keyDown: true)
{
    event.flags = .maskCommand
    event.postToPid(your_browser_pid)
}

使用Safari成功测试。