【问题标题】:AppleScript to detect when an accessibility setting has been changedAppleScript 检测可访问性设置何时更改
【发布时间】:2017-12-21 23:01:01
【问题描述】:

我正在尝试编写一个脚本,该脚本会在我的降低透明度设置发生更改时提醒我,以便我更好地了解可能会更改它的应用程序。

我可以手动打开系统偏好设置并使用 AppleScript 切换设置,但我无法读取设置,并且如果不实际打开新窗口就无法执行此操作。

我看过 this 教程,其中介绍了如何执行各种首选项脚本,但它没有显示任何可访问性设置。

【问题讨论】:

    标签: applescript


    【解决方案1】:

    这可能需要一些调查工作和耐心。首先,让我告诉您如何使用 AppleScript 读取和设置 降低透明度 设置:

        tell application "System Events" to ¬
        tell property list file "~/Library/Preferences/com.apple.universalaccess.plist" to ¬
            tell property list item "reduceTransparency"
                get its value -- returns true or false
                set its value to (not result) -- switch its setting
            end tell
    

    getset 命令执行您期望的操作。当然,您可以将(not result) 替换为truefalse 的特定值。

    据我所知,AppleScript 无法以您所追求的方式监控系统设置。虽然 Cocoa-AppleScripting 在事件侦听方面可以做得更多,但它并不是真正为此目的而设计的。

    但是,实际上 MacOS 内置了一个名为opensnoopTerminal 命令,它“跟踪文件打开。当进程发出打开文件时,会打印出 UID、PID 和路径名等详细信息。 " (引自手册页。

    这是调查部分必须发生的地方。

    运行sudo opensnoop(然后输入您的管理员密码),它会在文件访问发生时打印出文件访问以及有关该访问的大量相关信息(进程 ID、请求访问的应用程序的名称等) .这可能会使您收到大量关于您不关心的文件的无用信息,以及一堆 DTrace 错误(我相信这些是由 MacOS 的 System Integrity Protection 导致一些受保护的文件不会被 DTrace 读取)。

    因此,您可以尝试使用标志 -f-n 来指定要监视的特定文件 (f) 或特定进程 (n),例如

        sudo opensnoop -f ~/Library/Preferences/com.apple.universalaccess.plist
    

    但是,很难确定您应该查看哪个文件或流程(毕竟,这是您作为有罪方试图揭露的流程)。

    因此,您最终可能不得不用一个赤裸裸的sudo opensnoop 调用来超载自己,我建议您将其输出写入一个文本文件。这不仅会消除最终结果中的任何 DTrace 错误(尽管这些错误仍会出现在 Terminal 窗口本身,但不用担心),它会给您有机会稍后梳理并搜索相关术语,看看会出现什么。

    为此,请运行以下命令:

        sudo opensnoop > ~/Downloads/snoop.txt
    

    这会将所有数据写入 snoop.txt(我选择将其保存在 Downloads 文件夹中,以防万一你有你的 Desktop Documents 文件夹通过 iCloud 共享——只要 opensnoop 继续运行,文本文件就会不断修改,这意味着它将不断上传到iCloud 也是如此)。

    要终止 opensnoop 的运行,请返回 Terminal 窗口(通过此窗口必须保持打开状态,尽管您可以将其最小化),然后按 Ctrl-C。然后输入exit,回车,退出Terminal

    我不能保证这一定会解开你的谜团,但我确实希望它在某种程度上有所帮助。

    【讨论】:

    • 我刚刚收到this 几年前关于文件访问监控的问题。它有几个答案,详细说明了解决问题的各种技术。
    • 为什么我被扣了15分?没有可用的反馈。
    • 仅供参考 您的声誉受到 15 分影响的原因是因为 J.Doe 决定将不同的答案标记为已接受的答案。请注意,您的答案不再有绿色复选标记,而另一个答案有。看看:What is reputation? How do I earn (and lose) it?
    【解决方案2】:

    这是另一种选择。这适用于我使用最新版本的 Sierra

    property resultValue : missing value
    property originalValue : missing value
    
    tell application "System Preferences"
        tell its pane "Accessibility"
            reveal anchor "Seeing_Display"
            delay 1
            tell application "System Events"
                set originalValue to get value of checkbox "Reduce transparency" of window "Accessibility" of application process "System Preferences"
                set resultValue to originalValue
                repeat while resultValue is equal to originalValue
                    delay 1
                    set resultValue to get value of checkbox "Reduce transparency" of window "Accessibility" of application process "System Preferences"
                end repeat
            end tell
        end tell
    end tell
    
    tell application "System Preferences" to quit
    
    display notification with title ¬
        "REDUCE TRANSPARENCY HAS CHANGED"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      相关资源
      最近更新 更多