2017-11-02 10 views
0

私は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秒間寝かせても、 は変更されません。
+0

あなたのコードは自分のMac(MacOS 10.12)で動作します。 AppleScriptからイベントを投稿できませんか? – Willeke

+0

私のmacOSバージョンは10.13.1です。 AppleScriptはドラッグアンドドロップイベントをポストできないため、Swiftサブル​​ーチンを呼び出す必要があります。 標準のmacOS Cocoa AppテンプレートのapplicationDidFinishLaunching(_ :)や他の場所からpostClickEvent()を呼び出していますか? アプリの権限や入力のアクセシビリティの設定を変更しましたか? – Wojciech

答えて

0

デフォルトでサンドボックスを使用するのは、Xcode 9.0のSwift Package Managerの新機能です。

ネットワークアクセスとファイルシステムの変更を防ぐサンドボックスを使用するように、macOSでパッケージマニフェストの解釈とパッケージビルドが更新されました。これにより、悪意を持って作成されたマニフェストの影響を緩和します。 (31107213)

Xcode Release Notes

しかし、クォーツイベントは、Appサンドボックスとの互換性がありません。

別のアプリを制御するアプリをサンドボックスにすることはできません。 CGEventPostのような関数を使ってキーボードイベントやマウスイベントを投稿すると、この制限を回避する方法が提供されるため、サンドボックスアプリケーションからは許可されません。アプリを実行

App Sandbox Design Guide

アプリはヒューマンインターフェイスデバイス制御を拒否されたコンソールのサンドボックス侵害ログメッセージを残します。 Xcodeのターゲットエディタでアプリケーションのサンドボックスを無効に

Console

クォーツイベントを投稿することができます。

Xcode

関連する問題