簡體   English   中英

如何模擬從Mac App到其他應用程序的鼠標單擊

[英]How to simulate mouse click from Mac App to other Application

我試圖從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)它將單擊模擬器選項

在此輸入圖像描述

但當我提供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)

您說您可以發布鍵盤事件,因此它不太可能是權限問題,但您可以嘗試以root用戶身份執行您的程序來規則。

事件坐標可能與您期望的不同(翻轉?)。 嘗試在模擬應用中設置一些內容,以報告應用程序級別的所有已接收事件。

此外,屏幕坐標系中的坐標是? 也許事件是由模擬器接收並丟棄的,因為沒有窗口“在它下面”將它傳遞給它。 嘗試將模擬器窗口移動到屏幕的每個角落,並使用類似(10,10)的坐標。

您還可以嘗試NSEvent及其CGEvent方法來獲取可能根據您的需要正確初始化的基礎cgevent。 如果這樣可以更容易找出你所缺少的東西。

最后,嘗試mouseEventSource傳遞nil CGEventSourceRef eventSource = CGEventSourceCreate(kCGEventSourceStateHIDSystemState); 也許?

最后一次嘗試幫助:

我有一個(舊的)mac應用程序,它將制造的鼠標事件發送到其他程序; 也許它的源代碼可以揭示有用的東西。

現在......如果這些都不起作用,那么告訴我們你究竟想要完成什么可能對你有益。 它可能有更好的方法。

首先,如果你看一下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!")

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

運行演示

你很親密(Swift 4):

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

一開始沒有意識到的一個重要細節是必須禁用應用程序沙盒才能使此API正常工作。

發布此處是因為此問題是Google在OS X中發送點擊事件中最頂級的問題。

您可以查看drag'n'drop的工作示例並進行單擊功能。

只有一個注釋,您要點擊的窗口必須可見。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM