web-dev-qa-db-ja.com

Macアプリから他のアプリケーションへのマウスクリックをシミュレートする方法

CGEventsを使用しているため、macosアプリからiphoneシミュレーターでマウスクリックをシミュレートしようとしています。

iPhoneシミュレータのプロセスIDは33554です

let point = CGPoint(x: 500  , y:300)
let eventMouseDown = CGEvent(mouseEventSource: nil, mouseType: .leftMouseDown, mouseCursorPosition: point, mouseButton: .left)
let eventMouseUp = CGEvent(mouseEventSource: nil, mouseType: .leftMouseUp, mouseCursorPosition: point, mouseButton: .left)
eventMouseDown?.postToPid(33554)
eventMouseUp?.postToPid(33554)

また、iOSシミュレータウィンドウがフォーカスされているときにマウスクリックをシミュレートし、このツールバーでのみ機能しますが、シミュレータでは機能しないことに気付きました。たとえば、CGPointを(0,30)に変更すると、シミュレータオプションをクリックします。

enter image description here

しかし、iOSシミュレーター内のアプリをクリックするためにCGPointsを与えているとき、それは機能しません enter image description here

ただし、を使用してキーボードイベントをシミュレータに投稿することはできます

let keyboardDown = CGEvent(keyboardEventSource: nil, virtualKey: 6, keyDown: true)
let keyboardUp = CGEvent(keyboardEventSource: nil, virtualKey: 6, keyDown: false)
keyboardDown?.postToPid(33554)
keyboardUp?.postToPid(33554)
23
Faisal Khalid

まず、postToPidを見ると、ドキュメントはまったくありません。

PostToPID

ですから、それが機能すると思われるかどうか、そして機能する場合はいつ、いつ機能しないかさえわかりません。ただし、以下のコードを使用して、イベントを画面に直接投稿できます

//
//  main.Swift
//  mouseplay
//
//  Created by Tarun Lalwani on 22/05/18.
//  Copyright © 2018 Tarun Lalwani. All rights reserved.
//

import Foundation

let source = CGEventSource.init(stateID: .hidSystemState)
let position = CGPoint(x: 75, y: 100)
let eventDown = CGEvent(mouseEventSource: source, mouseType: .leftMouseDown, mouseCursorPosition: position , mouseButton: .left)
let eventUp = CGEvent(mouseEventSource: source, mouseType: .leftMouseUp, mouseCursorPosition: position , mouseButton: .left)


eventDown?.post(tap: .cghidEventTap)

//eventDown?.postToPid(71028)
usleep(500_000)
//eventUp?.postToPid(71028)
eventUp?.post(tap: .cghidEventTap)

print("Hello, World!")

あなたもそれが機能しているのを見ることができます

Run demo

7
Tarun Lalwani

キーボードイベントを投稿できると言っているので、権限の問題ではない可能性がありますが、rootとしてプログラムを実行して、それを除外することができます。

イベントの座標は、予想とは異なる場合があります(反転しますか?)。シミュレートされたアプリで何かを設定して、すべての受信イベントをアプリケーションレベルでレポートしてみてください。

さらに、画面の座標は座標系ですか?おそらく、イベントはシミュレータによって受信され、配信するウィンドウが「下」にないために破棄されます。シミュレータウィンドウを画面の各隅に移動し、座標に(10,10)のようなものを使用してみてください。

NSEventとそのCGEventメソッドを試して、必要に応じて正しく初期化できる基になるcgeventを取得することもできます。それがうまくいけば、あなたが欠けているものを見つけるのは簡単でしょう。

最後に、notnilmouseEventSourceに渡してみてください。 CGEventSourceRef eventSource = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);のようなものかもしれませんか?

ヘルプでの最後の溝の試み:

製造されたマウスイベントを他のプログラムにディスパッチする(古い)Macアプリケーションがあります。おそらくその ソースコード は何か有用なものを明らかにすることができます。

さて...それでもうまくいかない場合は、何を達成しようとしているのかを正確に教えておくとよいでしょう。はるかに良い方法がある可能性があります。

6
Brad Allred

あなたは近かった(Swift 4):

let mousePosition: CGPoint = .zero // your position here
let mouseEvent = CGEvent(mouseEventSource: nil, mouseType: .leftMouseDown, 
mouseCursorPosition: mousePosition, mouseButton: .left)
mouseEvent?.postToPid(33554)

最初は気づかなかった重要な詳細は、このAPIが機能するには、アプリのサンドボックス化を無効にする必要があるということです。

3

この質問は、OS Xのクリック送信イベントでGoogleで最も上位にあるため、ここに投稿してください。

ドラッグアンドドロップの動作 を見て、クリック機能を作成できます。

1つのメモ、クリックしようとしているウィンドウが表示されている必要があります。

0
Denis Makarskiy