私はQuartzイベントを別のアプリケーションに投稿するためにAppleScriptから起動される単純なCocoaアプリケーションを作成しています。Swiftアプリケーションの起動後にQuartzイベントを投稿するには?
ユーザーインターフェイスが不要なので、Interface Builderからウィンドウを削除し、Application Delegateからコンセントを削除しました。プライベートメソッドpostClickEvent()をメソッドapplicationDidFinishLaunching(_ :)から呼び出します。 mouseCursorPosition(x:0、y:0)にnil mouseEventSourceを指定してleftMouseDownとleftMouseUp CGEventsを初期化し、それらをcghidEventTapの位置にポストします。
import Cocoa
@NSApplicationMain
クラス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)
}
}アップルのメニューですが、それは起こりません。
私はいくつかの可能な解決策を考えることができます。
- デバッガで実行されるアプリケーションには、低レベルのユーザ入力イベント を送信する権限が必要な場合があります。 Quartzイベント を投稿するためのアプリが必要ですか?
- メソッドapplicationDidFinishLaunching(_ :)は、アプリケーションが起動された後、デフォルトの 通知センターによって送信され、 が初期化されてから最初のイベントを受信する前に送信されます。たぶん Application Delegateの別のメソッドからpostClickEvent()を呼び出す必要がありますか?
- イベントは、初期化時にイベントソースが必要な場合があります。しかし、 イベントソースが可能な3つのイベントソース状態IDのいずれかに対してinit(stateID :)で初期化されても、それを変更することはありません。
- イベントはフルスクリーンXcodeの後にフォーカスを受け取ったときに投稿することができます。クリックするのが早すぎると アップルメニュー項目です。しかし、スレッドを10秒間寝かせても、 は変更されません。
あなたのコードは自分のMac(MacOS 10.12)で動作します。 AppleScriptからイベントを投稿できませんか? – Willeke
私のmacOSバージョンは10.13.1です。 AppleScriptはドラッグアンドドロップイベントをポストできないため、Swiftサブルーチンを呼び出す必要があります。 標準のmacOS Cocoa AppテンプレートのapplicationDidFinishLaunching(_ :)や他の場所からpostClickEvent()を呼び出していますか? アプリの権限や入力のアクセシビリティの設定を変更しましたか? – Wojciech