首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何模拟从Mac App到其他应用程序的鼠标点击

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

Stack Overflow用户
提问于 2017-01-28 18:18:17
回答 4查看 6.2K关注 0票数 25

我试图模拟鼠标点击iphone模拟器从macos应用程序,因为我正在使用CGEvents。

iPhone模拟器的进程id为33554

代码语言:javascript
运行
复制
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),它将单击模拟器选项

但是,当我在iOS模拟器中给CGPoints点击应用程序时,它不工作

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

代码语言:javascript
运行
复制
let keyboardDown = CGEvent(keyboardEventSource: nil, virtualKey: 6, keyDown: true)
let keyboardUp = CGEvent(keyboardEventSource: nil, virtualKey: 6, keyDown: false)
keyboardDown?.postToPid(33554)
keyboardUp?.postToPid(33554)
EN

回答 4

Stack Overflow用户

发布于 2018-05-22 16:48:11

首先,如果您查看postToPid,就会发现根本没有文档

所以甚至不能确定它是否应该工作,如果是,那么何时和何时不工作。但是您可以使用以下代码将事件直接发布到屏幕上

代码语言:javascript
运行
复制
//
//  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!")

你也可以看到它在工作

票数 12
EN

Stack Overflow用户

发布于 2017-02-03 14:44:42

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

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

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

您还可以尝试使用NSEvent及其CGEvent方法来获取底层cgevent,它可以根据您的需要进行正确的初始化。如果这样做有效,那么就更容易找出你遗漏了什么。

最后,尽量不要为mouseEventSource传递nil。也许是像CGEventSourceRef eventSource = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);这样的?

帮助中的最后一次尝试:

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

现在..。如果这些都不起作用,你可以告诉我们你到底想要实现什么,这对你可能是有益的。有可能有更好的方法。

票数 6
EN

Stack Overflow用户

发布于 2018-01-07 06:18:13

你们很接近(Swift 4):

代码语言:javascript
运行
复制
let mousePosition: CGPoint = .zero // your position here
let mouseEvent = CGEvent(mouseEventSource: nil, mouseType: .leftMouseDown, 
mouseCursorPosition: mousePosition, mouseButton: .left)
mouseEvent?.postToPid(33554)

一开始没有意识到的一个重要细节是,必须禁用应用程序沙箱才能使此API工作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41908620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档