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

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

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

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

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

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

спасибо,

Dheeraj.

4 ответов


вы можете запустить 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

Ок у вас решение / справочная информация можно найти по этому адресу..

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


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


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

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