Quartz イベントを別のアプリに投稿するためだけに AppleScript から起動される単純な Cocoa アプリを作成しています。
ユーザー インターフェイスは必要ないので、Interface Builder からウィンドウを削除し、Application Delegate からウィンドウへのアウトレットを削除しました。postClickEvent()
メソッドからプライベート メソッドを呼び出しますapplicationDidFinishLaunching(_:)
。CGEvents を nil mouseEventSource at で初期化leftMouseDown
し、 locationに投稿します。leftMouseUp
mouseCursorPosition (x: 0, y: 0)
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メニューを開くことを期待していますが、そうはなりません。
いくつかの可能な解決策を考えることができます。
- デバッガーで実行されるアプリには、低レベルのユーザー入力イベントを投稿するためのアクセス許可が必要になる場合があります。Quartz イベントを投稿するためにアプリにアクセス許可が必要ですか?
- このメソッド
applicationDidFinishLaunching(_:)
は、アプリケーションが起動されて初期化された後、最初のイベントを受信する前に、デフォルトの通知センターによって送信されます。Application DelegatepostClickEvent()
の別のメソッドから呼び出す必要があるのではないでしょうか? - イベントには、初期化時にイベント ソースが必要になる場合があります。ただし、考えられる 3 つのイベント ソース状態 ID のいずれかで初期化されたイベント ソースを渡しても、イベント ソース
init(stateID:)
は変更されません。 - イベントは、アプリが全画面表示の Xcode の後でフォーカスを受け取ったときにポストされる可能性があり、Apple メニュー項目をクリックするには早すぎます。しかし、スレッドを 10 秒間スリープさせても、スレッドは変わりません。