如何模拟从Mac App到其他应用程序的鼠标单击

Fai*_*lid 21 macos mouseevent low-level swift

我试图从macos App模拟鼠标点击iphone模拟器,因为我正在使用CGEvents.

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)
Run Code Online (Sandbox Code Playgroud)

我也注意到,当ios模拟器窗口被聚焦时它模拟鼠标点击并且仅适用于此工具栏但不适用于模拟器,例如,如果我将CGPoint更改为(0,30)它将单击模拟器选项

在此输入图像描述

但当我提供CGPoints点击iOS模拟器内的应用程序时它无法正常工作 在此输入图像描述

但是,我可以使用键盘事件发送到模拟器

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

Bra*_*red 6

您说您可以发布键盘事件,因此它不太可能是权限问题,但您可以尝试以root用户身份执行您的程序来规则.

事件坐标可能与您期望的不同(翻转?).尝试在模拟应用中设置一些内容,以报告应用程序级别的所有已接收事件.

此外,屏幕坐标系中的坐标是?也许事件是由模拟器接收并丢弃的,因为没有窗口"在它下面"将它传递给它.尝试将模拟器窗口移动到屏幕的每个角落,并使用类似(10,10)的坐标.

您还可以尝试使用NSEventCGEvent方法来获取可能根据您的需要正确初始化的基础cgevent.如果这样可以更容易找出你所缺少的东西.

最后,尽量通过nilmouseEventSource.喜欢的东西CGEventSourceRef eventSource = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);可能?

最后一次尝试帮助:

我有一个(旧的)mac应用程序,它将制造的鼠标事件发送到其他程序; 也许它的源代码可以揭示有用的东西.

现在......如果这些都不起作用,那么告诉我们你究竟想要完成什么可能对你有益.它可能有更好的方法.


Tar*_*ani 6

首先,如果你看一下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 Code Online (Sandbox Code Playgroud)

你也可以看到它的工作原理

运行演示