用于检测辅助功能设置何时更改的AppleScript

时间:2017-12-21 23:01:02

标签: applescript

我正在尝试编写一个脚本,每当我的reduce透明度设置发生变化时都会提醒我,这样我就可以更好地了解应用程序可能会改变它。

我可以手动打开系统首选项并使用AppleScript切换设置,但我无法读取设置,我无法在不实际打开新窗口的情况下执行此操作。

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

2 个答案:

答案 0 :(得分:2)

这可能需要一些调查工作和耐心。首先,让我告诉您如何使用AppleScript阅读和设置 reduce transparency 设置:

    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的终端命令,名为opensnoop,其中"跟踪文件打开。当进程发出文件打开时,会打印出UID,PID和路径名等详细信息。" (引自手册页。

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

运行sudo opensnoop(然后输入您的管理员密码),它将在出现文件访问时打印出文件访问以及有关该访问的大量相关信息(进程ID,请求访问的应用程序的名称等) )。这可能会给您带来许多关于您不关心的文件的无用信息以及一堆 DTrace 错误(我相信这些错误来自MacOS' 系统完整性保护) 可防止DTrace读取某些受保护的文件。

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

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

但是,很难确定您应该关注哪个文件或进程(毕竟,这是您尝试发现有罪方的过程)。

所以,你可能最终不得不通过一个裸sudo opensnoop调用来重载自己,我建议你输出一个文本文件。这不仅会消除最终结果中的任何 DTrace 错误(尽管这些错误仍会出现在终端窗口本身,但不要担心它),它将给你一个机会在以后梳理它并搜索它的相关术语,看看会出现什么。

要执行此操作,请运行以下命令:

    sudo opensnoop > ~/Downloads/snoop.txt

将所有数据写入 snoop.txt (我已选择将其保存在 Downloads 文件夹中,以防您拥有通过iCloud共享的桌面文档文件夹 - 只要 opensnoop 继续运行,文本文件就会不断修改,这意味着它将是连续的也可以上传到iCloud。

要终止 opensnoop 的运行,请返回 Terminal 窗口(虽然可以将其最小化,但必须保持打开状态),然后按Ctrl-C。然后输入exit,点击返回,然后退出终端

我无法保证这肯定会解决你的谜团,但我希望它能以某种方式帮助你。

答案 1 :(得分:1)

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

namespace {
    void foo(); // to be defined outside in somewhere else
    int x = 0; // I want the above foo() to increment x
}

namespace {
    void foo();  // to be defined outside in somewhere else
                 // I want foo to do something else
}

// Here is my guess how to define a function outside Anonymous NS.
void ::foo() {
    cout << "::foo()" << endl;
}

// void foo(){
//   cout << "foo()" << endl;
//}

int main(){

    foo();
    ::foo();

    cout << endl;
    cin.get();
    return 0;
}