gpt4 book ai didi

macOS:模拟鼠标事件仅在启动二进制文件时有效,而不是应用程序包

转载 作者:行者123 更新时间:2023-12-04 10:00:19 24 4
gpt4 key购买 nike

我有以下代码可以在 Mac 上移动鼠标光标:

void moveCursorPos()
{
CGPoint ppos;
ppos.x = 100;
ppos.y = 100;

CGEventRef e = CGEventCreateMouseEvent(nullptr, kCGEventMouseMoved, ppos, kCGMouseButtonLeft);
CGEventPost(kCGHIDEventTap, e);
CFRelease(e);
}

当我直接从它的二进制文件运行我的软件时它可以工作 - 例如 ./foo.app/Contents/MacOS/foo .
当我通过 open foo.app 启动它时它不起作用.
open ./foo.app/Contents/MacOS/foo作品。

我第一次启动它并调用该函数时,macOS 要求我获得使用辅助功能 API(或类似的东西)的权限,我同意了 - 如果我转到 macOS 安全设置的“辅助功能 > 隐私” Pane ,所有复选框都被选中,一切都被授予 foo , 等等...
  • 我如何在我的机器上修复它?
  • 我可以在代码方面做些什么,以便我的软件的用户永远不会遇到该问题,因为它会破坏我的软件的核心 UI 交互?
  • 最佳答案

    我如何在我的机器上修复它?

    这真的取决于你做了什么。当我直接从 Xcode 运行应用程序时,我通常会破坏这些东西,发行版,......并且所有这些都具有相同的包标识符(系统偏好设置中的一个条目,但周围有更多的二进制文件)。

    要为您的应用重置辅助功能,只需运行:

    sudo tccutil reset Accessibility com.your.bundle.Identifier

    它将为所有出现的二进制文件重置辅助功能设置,您可以重新开始。

    我可以在代码方面做些什么,以便我的软件的用户永远不会遇到该问题,因为它会破坏我的软件的核心 UI 交互?

    在您的 AppDelegate.applicationDidFinishLaunching 中执行以下操作:

    acquireAccessibilityPrivileges(acquired: {
    self.moveCursorPos()
    }, nope: {
    NSApp.terminate(self)
    })

    其他功能:

    func acquireAccessibilityPrivileges(acquired: @escaping () -> Void, nope: @escaping () -> Void) {
    let options = [kAXTrustedCheckOptionPrompt.takeUnretainedValue(): true]
    let enabled = AXIsProcessTrustedWithOptions(options as CFDictionary)

    if enabled {
    acquired()
    } else {
    let alert = NSAlert()
    alert.messageText = "Enable XYZ"
    alert.informativeText = "Click OK once you enabled XYZ in System Preferences - ..."
    alert.beginSheetModal(for: self.window, completionHandler: { response in
    if AXIsProcessTrustedWithOptions(options as CFDictionary) {
    acquired()
    } else {
    nope()
    }
    })
    }
    }

    func moveCursorPos() {
    let event = CGEvent(mouseEventSource: nil, mouseType: .mouseMoved, mouseCursorPosition: CGPoint(x: 100, y: 100), mouseButton: .left)
    event?.post(tap: .cghidEventTap)
    }
    open foo.app对比 ./foo
    还有一件事需要注意 - open foo.app 之间的区别, ./foo.app/Contents/MacOS/foo , ...
    open Foo.app :
  • Foo.app需要此访问权限
  • -+= 00001 root /sbin/launchd
    |--= 83677 zrzka /Users/zrzka/Desktop/Foo.app/Contents/MacOS/Foo
    Foo.app/Contents/MacOS/Foo :
  • Iterm.app需要此访问权限
  • -+= 00001 root /sbin/launchd
    |-+= 53984 zrzka /Applications/iTerm.app/Contents/MacOS/iTerm2
    | |-+= 53986 zrzka /Applications/iTerm.app/Contents/MacOS/iTerm2 --server /usr/bin/login -fpl zrzka /Applications/iTerm.app/Contents/MacOS/iTerm2 --launch_shell
    | | \-+= 53987 root /usr/bin/login -fpl zrzka /Applications/iTerm.app/Contents/MacOS/iTerm2 --launch_shell
    | | \-+= 53988 zrzka -zsh
    | | \--= 84461 zrzka Foo.app/Contents/MacOS/Foo
    open Foo.app/Contents/MacOS/Foo :
  • Terminal.app推出并Foo在里面
  • 那是因为我确实使用 iTerm,但默认的是终端
  • Terminal.app需要此访问权限
  • -+= 00001 root /sbin/launchd
    |-+= 73320 zrzka /System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal
    | \-+= 75674 root login -pf zrzka
    | \-+= 75679 zrzka -zsh
    | \--= 75717 zrzka /Users/zrzka/Desktop/Foo.app/Contents/MacOS/Foo

    更多提示

    有时,我的应用程序不再出现在系统偏好设置 - 安全和隐私 - 辅助功能中。我不知道为什么,但它以某种方式与我的 tccutil 有关。重置。打开 Finder 并拖放 Foo.app进入 Pane 。

    关于macOS:模拟鼠标事件仅在启动二进制文件时有效,而不是应用程序包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61843481/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com