通过编程启用辅助设备访问

7
我想以编程方式启用系统偏好设置中的辅助设备访问权限。但问题在于我的应用程序不是以根用户身份运行,我也不希望我的应用程序作为根用户运行,同时也不需要在其中进行任何身份验证。
我想全局捕获键盘事件。我正在使用CGEventTapCreate()进行此操作。在CGEventTapCreate() API的文档中,如果满足以下条件之一,则事件监听器将接收按键按下和释放事件:
1. 当前进程正在以根用户身份运行。 2. 启用了辅助设备访问权限。在Mac OS X v10.4及更高版本中,您可以使用“系统偏好设置”中的“通用访问”面板、“键盘”视图来启用此功能。
我尝试手动检查“系统偏好设置”中的“辅助设备访问权限”是否已启用,并得到了预期的输出。
因此,有没有办法在不要求认证的情况下通过程序实现相同的功能,而且应用程序不是以根用户身份运行?
谢谢, Dheeraj。
4个回答

6

您可以运行一个Applescript(或将Applescript翻译成ScriptingBridge或其他Objective-C层以上的AppleEvents)

这里是一个我在一个特定项目中使用的Applescript,它做了类似于您所需的操作:

on isUIScriptingOn()
    tell application "System Events" to set isUIScriptingEnabled to UI elements enabled
    return isUIScriptingEnabled
end isUIScriptingOn

on turnUIScriptingOn(switch)
    tell application "System Events"
        activate
        set UI elements enabled to switch
    end tell
end turnUIScriptingOn

on run
    if not isUIScriptingOn() then
        display dialog "Enable Access for assistive devices (found in the Universal Access System Preference) must be on for this software to correctly work. This program will enable this setting for you"
        turnUIScriptingOn(true)
        display dialog "Access for assistive devices in now on"
    end if
end run

4

大家好,以下是关于解决问题的一些背景信息,具体方案请点击此链接查看

因此,在Tiger中,苹果提供了另一个解决方案来解决这些问题:神奇的函数AXMakeProcessTrusted。它将为您的应用程序启用API,并且需要从以root身份运行的进程中调用,因此非常安全。它也是自动化的,除了要求用户输入密码外,用户无需执行任何操作。 问题在于似乎没有人使用它。我见过的每个第三方应用程序甚至包括Automator在内都只会要求用户手动在“系统偏好设置”中勾选复选框。尽管实现起来更费力,而且有一个巨大的未记录错误(在实际信任之前必须重新启动应用程序 更新:报告为#5711990),但我真的认为人们应该使用它。因此,我想发布代码,使其易于在您的应用程序中实现。它还包括一个辅助代理,您应该可以将其直接添加到您的项目中。


很遗憾,存档的博客文章中没有包含示例代码。 - JWWalker

3

通常情况下,未经允许更改用户系统设置被认为是不礼貌的行为。大多数需要此设置的应用程序只需检查其是否启用,如果未启用,则告知用户打开。


有一种方法可以按进程启用它。不幸的是,我不知道是什么,但我有一些应用程序可以这样做,我记得在Cocoa开发邮件列表上看到了一些相关内容。 - hooleyhoop
那么你如何通过编程检查它是否已启用呢? - Chetan

0
有一种方法可以按进程启用它。不幸的是,我不知道具体是什么方法,但我有一些应用程序可以实现这个功能,我记得在Cocoa开发者邮件列表上看到过相关内容。
你确定可以在进程级别启用它,并且无需管理员权限吗?如果是这样的话,会捕获所有事件,还是只会捕获属于该进程的事件?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接