【问题标题】:How to simulate mouse click from Mac App to other Application如何模拟从 Mac App 到其他应用程序的鼠标点击
【发布时间】:2017-06-13 23:59:30
【问题描述】:

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

【问题讨论】:

  • 你还记得 macOS 上的 y 轴是反转的吗?
  • 您有没有办法让它工作?我有完全相同的问题。键盘事件就像一个魅力,但鼠标没有。

标签: swift macos mouseevent low-level


【解决方案1】:

在这里发帖是因为这个问题是 Google 在 OS X 中发送点击事件中最多的问题。

你可以看看drag'n'drop的工作examples并做一个点击功能。

只有一个注释,你要点击的窗口必须是可见的。

【讨论】:

    【解决方案2】:

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

    你可以看到它也在工作

    【讨论】:

    • 我已经让 postToPid 用于键盘事件,但需要 post(tap:) 用于鼠标事件
    • 你能告诉你如何让 postToPid 为键盘事件工作吗?
    • 您可以在这里查看我的实现:github.com/dldnh/sendkey/blob/master/main.swift - 希望对您有所帮助!
    • 确保您已在辅助功能设置中允许您的应用控制此计算机以使其正常工作
    【解决方案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 正常工作。

    【讨论】:

      【解决方案4】:

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

      事件坐标可能与您的预期完全不同(翻转?)。尝试在模拟应用程序中设置一些东西以报告应用程序级别的所有接收事件。

      另外,坐标是屏幕坐标系吗?也许该事件被模拟器接收并丢弃,因为它“下方”没有窗口可以将其传递到。尝试将模拟器窗口移动到屏幕的每个角落,并使用 (10,10) 之类的坐标作为坐标。

      您也可以尝试NSEvent 及其CGEvent 方法来获取可以根据您的需要正确初始化的底层cgevent。如果这样行得通,那么找出你缺少的东西会更容易。

      最后,尝试nil 传递给mouseEventSource。可能是CGEventSourceRef eventSource = CGEventSourceCreate(kCGEventSourceStateHIDSystemState); 之类的?

      最后的帮助尝试:

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

      现在...如果这些都不起作用,告诉我们您到底想要完成什么可能对您有所帮助。可能有更好的方法。

      【讨论】:

        猜你喜欢
        • 2022-01-09
        • 1970-01-01
        • 2011-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-24
        • 1970-01-01
        相关资源
        最近更新 更多