問題タブ [cgeventtap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
macos - root ユーザーとしてアプリを実行している場合にのみ、CGEventTap マウス イベント位置の上書きが可能ですか?
カーソルを制御する macOS アプリを開発しています。私は CGEvent Tap を使用しており、最終的なマウス位置をオフセットするために CGEvents に演算を追加しています。アプリは原則として期待どおりに動作しますが、場合によっては、より具体的には、特定の一般的なイラスト ソフトウェアでスタイラス ペンを使用してアプリを実行すると、元の場所でマウスの「ゴースト」位置がちらつくことがあります。良いことに、root ユーザーとしてログインしてアプリを実行すると、この問題を解決できます。私はかなりの数のSO投稿を読みましたが、この特定の投稿が問題に最もよく対処しています:
https://stackoverflow.com/a/9899901/5066660
この投稿で説明されているように、問題はおそらく次のとおりです。
残念ながら、CGEventTapCreate() ドキュメントには次のように記載されています。root ユーザーとして実行されているプロセスのみが、HID イベントがウィンドウ サーバーに入るポイントでイベント タップを見つけることができます。他のユーザーの場合、この関数は NULL を返します。
タップが有効であるため、関数は間違いなく null を返しません。また、その関数の引数の可能なすべての組み合わせを試しましたが、すべて同じように動作します。その投稿のさらに下では、次のように問題に取り組むことが提案されています。
おそらく、この機能をスーパーユーザー権限を持つ別のプロセスに分割して、アプリの残りの部分を通常のユーザーモードのままにすることができますか? プログラムが実行する特定のアクションに対してのみルート権限を要求する方法もあると思います。
これが可能な解決策である場合、私はそれを実装したいと思います! だから私の質問は:どのように?CGEventTap などの CoreGraphics コードだけでなく、昇格されたアクセス許可でスクリプトを実行することに遭遇しました。これは可能ですか?これがどのように達成されるか、または問題に対する他の解決策の例を誰か教えてもらえますか?
すべての助けを歓迎します、どうもありがとうございました。
swift - Swift アプリケーションの起動後に Quartz イベントを投稿するには?
Quartz イベントを別のアプリに投稿するためだけに AppleScript から起動される単純な Cocoa アプリを作成しています。
ユーザー インターフェイスは必要ないので、Interface Builder からウィンドウを削除し、Application Delegate からウィンドウへのアウトレットを削除しました。postClickEvent()
メソッドからプライベート メソッドを呼び出しますapplicationDidFinishLaunching(_:)
。CGEvents を nil mouseEventSource at で初期化leftMouseDown
し、 locationに投稿します。leftMouseUp
mouseCursorPosition (x: 0, y: 0)
cghidEventTap
アプリが起動するとすぐに左上隅をクリックしてAppleメニューを開くことを期待していますが、そうはなりません。
いくつかの可能な解決策を考えることができます。
- デバッガーで実行されるアプリには、低レベルのユーザー入力イベントを投稿するためのアクセス許可が必要になる場合があります。Quartz イベントを投稿するためにアプリにアクセス許可が必要ですか?
- このメソッド
applicationDidFinishLaunching(_:)
は、アプリケーションが起動されて初期化された後、最初のイベントを受信する前に、デフォルトの通知センターによって送信されます。Application DelegatepostClickEvent()
の別のメソッドから呼び出す必要があるのではないでしょうか? - イベントには、初期化時にイベント ソースが必要になる場合があります。ただし、考えられる 3 つのイベント ソース状態 ID のいずれかで初期化されたイベント ソースを渡しても、イベント ソース
init(stateID:)
は変更されません。 - イベントは、アプリが全画面表示の Xcode の後でフォーカスを受け取ったときにポストされる可能性があり、Apple メニュー項目をクリックするには早すぎます。しかし、スレッドを 10 秒間スリープさせても、スレッドは変わりません。
objective-c - プログラムによるキーの押下が処理されるのを待っています
誰かがプログラムでキーを押すためのコードのスニペットを投稿しました:
これは同期ではありません。キーの押下が処理されたことを確認する適切な方法は何ですか?
後でダミーキーを押すことを考えましたが、すべてのキーの組み合わせが使用されている可能性があると思います。私の目標は、アクセシビリティ プログラミングを使用せずに、現在アクティブなアプリケーションのデータをプログラムでコピー/貼り付けることです。