Как имитировать щелчок мышью из приложения Mac в другое приложение

Я пытаюсь имитировать щелчок мыши на симуляторе iphone из приложения macos для этого, я использую CGEvents.

идентификатор процесса - 33554 для симулятора iPhone.

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), он нажмет на параметр Simulator

введите описание изображения здесь

но когда я даю CGPoints кликнуть приложение внутри iOS Simulator, он не работает введите описание изображения здесь

Тем не менее, я могу опубликовать событие Keyboard Event to Simulator, используя

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

Ответ 1

Вы говорите, что можете публиковать события клавиатуры, так что это вряд ли проблема с правами доступа, но вы можете попробовать запустить вашу программу как root, чтобы исключить это.

Координаты события могут просто отличаться от того, что вы ожидаете (перевернуто?). Попробуйте настроить что-то в смоделированном приложении, чтобы отчитываться обо всех полученных событиях на уровне приложения.

Кроме того, координаты в системе координат экрана? Возможно, событие получено симулятором и отброшено, потому что нет "окна" под ним для его доставки. Попробуйте переместить окно симулятора в каждый угол экрана и используйте что-то вроде (10,10) для координаты.

Вы также можете попробовать NSEvent и его метод CGEvent чтобы получить базовый cgevent, который может быть правильно инициализирован для ваших нужд. Если это сработает, вам будет легче решить, чего вам не хватает.

Наконец, попробуйте не передавать nil для mouseEventSource. Что-то вроде CGEventSourceRef eventSource = CGEventSourceCreate(kCGEventSourceStateHIDSystemState); может быть?

Последняя попытка рва помочь:

У меня есть (старое) приложение для Mac, которое отправляет производимые события мыши в другие программы; возможно, его исходный код может показать что-то полезное.

Теперь... если ничего из этого не сработало, вам может быть полезно рассказать нам, чего именно вы пытаетесь достичь. Возможно, есть гораздо лучший способ.

Ответ 2

Прежде всего, если вы посмотрите на 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

Ответ 3

Вы были близки (Swift 4):

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

Важная деталь, которая не понимала вначале, заключается в том, что для работы этого API для этого API должна быть отключена песочница приложения.

Ответ 4

Публикуйте здесь, потому что этот вопрос является самым популярным в Google по событию отправки кликов в OS X.

Вы можете взглянуть на рабочие примеры drag'n'drop и сделать функцию щелчка.

Только одна заметка, окно, в котором вы собираетесь щелкнуть, должно быть видно.