Comment simuler un clic de souris de L'application Mac à une autre Application

j'essaie de simuler un clic de souris sur iphone simulator de macos App pour que j'utilise CGEvents .

<!-Le numéro d'identification du procédé est 33554 pour iPhone simulator

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)

j'ai aussi remarqué qu'il simule le clic de la souris quand la fenêtre du simulateur ios est focalisée et ne fonctionne que pour cette barre d'outils mais pas pour le simulateur par exemple si je change CGPoint à (0,30) il cliquera sur L'option du simulateur

enter image description here

mais quand je donne CGPoints pour cliquer app à L'intérieur du simulateur iOS il ne fonctionne pas enter image description here

cependant, je suis capable d'afficher L'événement clavier sur le simulateur en utilisant

let keyboardDown = CGEvent(keyboardEventSource: nil, virtualKey: 6, keyDown: true)
let keyboardUp = CGEvent(keyboardEventSource: nil, virtualKey: 6, keyDown: false)
keyboardDown?.postToPid(33554)
keyboardUp?.postToPid(33554)
19
demandé sur Faisal Khalid 2017-01-28 13:18:17

4 réponses

vous dites que vous êtes capable de poster des évènements clavier, donc ce n'est probablement pas un problème de permission, mais vous pouvez essayer d'exécuter votre programme en tant que root pour exclure cela.

les coordonnées de L'événement peuvent tout simplement être différentes de ce que vous attendez (inversé?). Essayez de configurer quelque chose dans une simulation d'application de rapport sur réception d'événements au niveau de la demande.

de plus, les coordonnées sont-elles dans le système de coordonnées d'écran? Peut-être que l'événement est reçu par le simulateur et ignoré car il n'y a pas de fenêtre "sous" pour le livrer. Essayez de déplacer la fenêtre du simulateur à chaque coin de l'écran et utilisez quelque chose comme (10,10) pour une coordonnée.

vous pouvez aussi essayer NSEvent et son CGEvent méthode pour obtenir le cgevent sous-jacent qui peut être initialisé correctement pour vos besoins. Si cela fonctionne, il sera plus facile de comprendre ce que vous manquez.

Enfin, essayez passage nil pour les mouseEventSource. Quelque chose comme CGEventSourceRef eventSource = CGEventSourceCreate(kCGEventSourceStateHIDSystemState); peut-être?

dernière tentative de fossé à l'aide:

j'ai une (ancienne) application mac qui envoie les événements de souris fabriqués à d'autres programmes; peut-être son code source peut révéler quelque chose d'utile.

Maintenant... si rien de tout cela fonctionne, il pourrait être avantageux pour vous de nous dire exactement ce que vous essayez d'accomplir. Il est possible qu'il y ait une bien meilleure façon.

6
répondu Brad Allred 2017-02-03 06:44:41

d'Abord, si vous regardez postToPid il n'y a pas de documentation à tous

PostToPID

donc même pas sûr si elle est censée fonctionner et si oui, alors quand et quand pas. Mais vous pouvez poster l'événement directement à l'écran en utilisant le code ci-dessous

//
//  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!")

Vous pouvez le voir, il travail aussi

Run demo

5
répondu Tarun Lalwani 2018-05-22 08:48:10

Vous étiez proche (Swift 4):

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

un détail important qui ne s'est pas rendu compte au début est que le bac à sable app doit être désactivé pour que cette API fonctionne.

3
répondu Charlton Provatas 2018-01-07 16:48:41

Poste ici, parce que cette question est le plus haut dans Google sur envoyer, cliquez sur événement dans OS X.

Vous pouvez prendre un coup d'oeil sur le travail exemples de drogue-n-drop et faire une fonction de clic.

une seule note, la fenêtre où vous allez cliquer doit être visible.

0
répondu Denis Makarskiy 2017-04-21 12:00:07