【发布时间】:2018-04-15 15:08:40
【问题描述】:
我正在编写一个简单的 Cocoa 应用程序,该应用程序将从 AppleScript 启动,只是为了将 Quartz 事件发布到另一个应用程序。
不需要用户界面,因此我从 Interface Builder 中删除了窗口,并从 Application Delegate 中删除了它的出口。我从方法applicationDidFinishLaunching(_:) 中调用了一个私有方法postClickEvent()。我在mouseCursorPosition (x: 0, y: 0) 使用nil mouseEventSource 初始化leftMouseDown 和leftMouseUp CGEvents 并将它们发布到位置cghidEventTap。
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ aNotification: Notification) {
postClickEvent()
}
func applicationWillTerminate(_ aNotification: Notification) {
}
private func postClickEvent() {
let point = CGPoint(x: 0, y: 0)
let leftMouseDownEvent = CGEvent(mouseEventSource: nil, mouseType: .leftMouseDown, mouseCursorPosition: point, mouseButton: .left)
let leftMouseUpEvent = CGEvent(mouseEventSource: nil, mouseType: .leftMouseUp, mouseCursorPosition: point, mouseButton: .left)
leftMouseDownEvent?.post(tap: .cghidEventTap)
leftMouseUpEvent?.post(tap: .cghidEventTap)
}
}
我希望应用程序在启动后立即单击左上角并打开 Apple 菜单,但它没有发生。
我能想到几种可能的解决方案。
- 在调试器中运行的应用程序可能需要权限才能发布 低级用户输入事件。应用是否需要获得权限才能发布 石英事件?
- 默认发送
applicationDidFinishLaunching(_:)方法 应用程序启动后的通知中心和 初始化但在它收到第一个事件之前。可能是postClickEvent()应该从另一个方法调用 申请代表? - 事件在初始化时可能需要一个事件源。但是路过
对于这三个中的任何一个,使用
init(stateID:)初始化的事件源 可能的事件源状态 ID 不会改变它。 - 可以在应用程序在全屏 Xcode 后获得焦点时发布事件,这样太早了,无法单击 Apple 菜单项。但是让线程休眠 10 秒并不会改变它。
【问题讨论】:
-
您的代码可以在我的 Mac (macOS 10.12) 上运行。您不能从 AppleScript 发布活动吗?
-
我的 macOS 版本是 10.13.1。 AppleScript 无法发布拖放事件,因此我想调用 Swift 子例程。您是从标准 macOS Cocoa App 模板的 applicationDidFinishLaunching(_:) 还是从其他地方调用 postClickEvent() ?您是否对应用权限或输入辅助功能设置进行了任何更改?
标签: swift xcode cocoa macos-high-sierra cgeventtap