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

时间:2017-01-28 10:18:17

标签: swift macos mouseevent low-level

我正在尝试从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)

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

enter image description here

但是当我提供CGPoints来点击iOS模拟器中的应用程序时它无法正常工作 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)

4 个答案:

答案 0 :(得分:6)

您说您可以发布键盘事件,因此它不太可能是权限问题,但您可以尝试以root身份执行您的程序来排除这一点。

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

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

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

最后,尝试nil传递mouseEventSource。像CGEventSourceRef eventSource = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);这样的东西可能吗?

最后一次尝试帮助:

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

现在......如果这些都无效,那么告诉我们你想要完成什么可能对你有益。它有可能有更好的方法。

答案 1 :(得分:5)

首先,如果您查看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

答案 2 :(得分: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正常工作。

答案 3 :(得分:0)

发布此处是因为此问题是Google在OS X中发送点击事件时最重要的问题。

您可以查看拖放工作examples并点击功能。

只有一个音符,您要点击的窗口必须可见。