Как имитировать щелчок мышью из приложения 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), он нажмет на параметр «Симулятор».

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

но когда я даю CGPoints, чтобы щелкнуть приложение внутри iOS 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)

person Faisal Khalid    schedule 28.01.2017    source источник
comment
Вы помните, что в macOS ось Y перевернута?   -  person Alistra    schedule 02.02.2017
comment
Вы нашли способ заставить это работать? У меня точно такая же проблема. События клавиатуры работают как шарм, а мышь - нет.   -  person Juan Pedro Lozano    schedule 23.03.2021


Ответы (4)


Во-первых, если вы посмотрите на 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!")

Вы также можете увидеть, как это работает

Запустить демонстрацию

person Tarun Lalwani    schedule 22.05.2018
comment
Я получил postToPid для работы с событиями клавиатуры, но мне нужен post(tap:) для событий мыши. - person dldnh; 25.02.2021
comment
Расскажите, пожалуйста, как вы заставили postToPid работать с событиями клавиатуры? - person Tarun Lalwani; 27.02.2021
comment
Вы можете посмотреть мою реализацию здесь: github.com/dldnh/sendkey/blob/ master/main.swift — надеюсь, это поможет! - person dldnh; 27.02.2021
comment
Убедитесь, что вы разрешили своему приложению управлять этим компьютером в настройках специальных возможностей, чтобы это работало. - person TimD; 09.07.2021

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

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

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

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

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

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

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

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

person Brad Allred    schedule 03.02.2017

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

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

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

person Charlton Provatas    schedule 06.01.2018

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

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

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

person Denis Makarskiy    schedule 21.04.2017