Разрешить доступ к вспомогательному устройству программно - PullRequest
7 голосов
/ 01 июня 2010

Я хочу включить Access для вспомогательных устройств в Системных настройках программно. Но проблема в том, что мое приложение не работает от имени пользователя root, и я не хочу, чтобы мое приложение было от имени пользователя root, а также не должно запрашивать какую-либо аутентификацию между ними.

Я хочу использовать все события клавиатуры во всем мире. Я использую CGEventTapCreate () для того же. В документации по API CGEventTapCreate () упоминается, что события, отводящие события, получают события нажатия клавиш вверх и вниз, если выполняется одно из следующих условий:

  1. Текущий процесс выполняется от имени пользователя root.
  2. Доступ для вспомогательных устройств включен. В Mac OS X v10.4 и новее вы можете включить эту функцию, используя Системные настройки, панель «Универсальный доступ», вид клавиатуры.

Я попытался вручную, проверив Включить доступ для вспомогательных устройств в Системных настройках, и он выдает ожидаемый результат.

Так есть ли способ сделать то же самое с помощью программы, не запрашивая аутентификацию, а также приложение не запускается от имени пользователя root?

Спасибо

Dheeraj.

Ответы [ 4 ]

6 голосов
/ 01 июня 2010

Вы можете запустить Applescript (или перевести Applescript в ScriptingBridge или любой другой слой Objective-C поверх AppleEvent):

Вот 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 голосов
/ 29 апреля 2012

Хорошо, вы можете найти решение / некоторую справочную информацию можно найти по этому адресу ..

Итак, Apple разработала еще одно решение в Tiger, которое решает эти проблемы: волшебная функция AXMakeProcessTrusted . Это активирует API только для вашего приложения и должно вызываться из процесса, выполняющегося от имени пользователя root, поэтому он безопасен . Это также все автоматически, так что кроме того, чтобы спрашивать у пользователя его / ее пароль, пользователю ничего не нужно делать. Проблема в том, что, кажется, никто не использует его. Каждое стороннее приложение, которое я видел, и даже Automator просто просит пользователя вручную установить флажок в Системных настройках. Это больше работы для реализации и имеет одну огромную недокументированную ошибку (приложение должно быть перезапущено, прежде чем оно действительно станет доверенным. Update: заявлено как # 5711990), но я действительно думаю, что люди должны его использовать. Поэтому я решил выпустить код, чтобы упростить его реализацию в вашем приложении. В него входит вспомогательный агент, который вы можете просто добавить в свой проект.

3 голосов
/ 01 июня 2010

Обычно считается грубым изменять настройки системы пользователя, по крайней мере, не сказав им об этом, если явно не просят разрешения. Большинство приложений, которым нужен этот параметр, просто проверяют, включен ли он, а если нет, говорят пользователю включить его.

0 голосов
/ 09 августа 2010

Существует способ включить его для каждого отдельного процесса. К сожалению, я не знаю, что это такое, у меня есть приложения, которые делают это, и я думаю, что я помню, что видел что-то об этом в списке рассылки разработчиков какао

Вы уверены, что возможно включить его отдельно для каждого процесса, не имея прав администратора? И если да, будут ли регистрироваться все события или только те, которые принадлежат процессу?

...