ターミナル/アプリ経由のアクセシビリティでグレースケールモードを有効/無効にする方法は?


6

システム環境設定のアクセシビリティパネルでグレースケールモードを有効/無効にするプロセスはどうなるのでしょうか?

Dockでアプリをクリックするか、ターミナルコマンドで簡単なスクリプトを実行し、グレースケールモードから通常モードに切り替えます。

何か案は?

回答:


4

注:サンプルのAppleScriptコードは、最新のmacOS(Mojave)を処理し、コードの改善を追加するために更新されました。OS X / macOSの以前のバージョンでof group 1は、コードを機能させるために、2行のサンプルのAppleScriptコードからそれを削除する必要がある場合があります。


AppleScriptアプリケーションを作成してDockに入れる場合は、OS X Yosemiteで次のコードを使用できます(後者の場合は信じています)。

if running of application "System Preferences" then
    try
        tell application "System Preferences" to quit
    on error
        do shell script "killall 'System Preferences'"
    end try
end if

repeat while running of application "System Preferences" is true
    delay 0.01
end repeat

tell application "System Preferences" to reveal anchor "Seeing_Display" of ¬
    pane id "com.apple.preference.universalaccess"

tell application "System Events" to tell process "System Preferences"
    repeat until exists checkbox "Use grayscale" of group 1 of ¬
        window "Accessibility"
        delay 0.01
    end repeat
    click the checkbox "Use grayscale" of group 1 of window "Accessibility"
end tell

tell application "System Preferences" to quit

スクリプトエディターで、ファイル形式を次のように変更してグレースケールの切り替えとして保存します。

コピーしてアプリの別のアイコンをアプリのGet Infoシートのアイコンに貼り付けてから、アプリバンドルをDockにドラッグアンドドロップできます。

正常に実行するには、[システム環境設定]の[セキュリティとプライバシー]の[プライバシー]タブの[アクセシビリティ]で許可を与える必要があります。


IconDaemonが提供するコードを使用してbashスクリプトを使用する場合、次のコードは、現在の設定に基づいて色とグレースケールの使用を切り替えます。

#!/bin/bash

setGrayscale () {

    defaults write com.apple.universalaccess grayscale -bool $1
    defaults write com.apple.CoreGraphics DisplayUseForcedGray -bool $1
    launchctl unload /System/Library/LaunchAgents/com.apple.universalaccessd.plist
    launchctl load /System/Library/LaunchAgents/com.apple.universalaccessd.plist

    case "$1" in
        "NO")
            echo "  Changing Display to use color. This will take a moment..."
        ;;
        "YES")
            echo "  Changing Display to use grayscale. This will take a moment..."
        ;;
    esac

}

_bool="$(defaults read com.apple.universalaccess grayscale 2>/dev/null)"

case "$_bool" in
    "0")
        setGrayscale "YES"
    ;;
    "1")
        setGrayscale "NO"
    ;;
    *)
        setGrayscale "YES"
    ;;
esac

ここに画像の説明を入力してください


2
delay 1クリックチェックボックスの前に追加した後に機能しました。ありがとう!
ArleyM

user3439894このエラーが発生します:システムイベントにエラーが発生しました:プロセス「システム環境設定」のウィンドウ「アクセシビリティ」を取得できません。(-1728)間違った場所をトラブルシューティングしようとしています...ありがとう!
コリースナイダー

@Cory Snider、サンプルのAppleScriptコードを更新して、現在の最新のmacOS(Mojave)を処理し、コードの改善を追加しました。OS X / macOSの以前のバージョンでは、コードを機能させるために、AppleScriptコードの2行の例からグループ1を削除する必要がある場合があります。
user3439894

6

これには、目的のCプログラムをコンパイルする開発者ツールが必要です。プログラムは、このStackoverflowの回答に基づいています

次の内容のgrayscale.cというファイルを作成します。

// clang -g -O2 -std=c11 -Wall -framework ApplicationServices
// https://stackoverflow.com/questions/14163788/how-does-on-screen-color-inversion-work-in-os-x
#include <stdio.h>
#include <ApplicationServices/ApplicationServices.h>

CG_EXTERN bool CGDisplayUsesForceToGray(void);
CG_EXTERN void CGDisplayForceToGray(bool forceToGray);

int
main(int argc, char** argv)
{
    bool isGrayscale = CGDisplayUsesForceToGray();
    printf("isGrayscale = %d\n", isGrayscale);
    CGDisplayForceToGray(!isGrayscale);
    printf("Grayscale is now: %d\n", CGDisplayUsesForceToGray());

    return 0;
}

次に、次のコマンドを実行してコンパイルします。

clang -g -O2 -std=c11 -Wall -framework ApplicationServices ./grayscale.c -o toggle-grayscale

今すぐ実行./toggle-grayscaleこれにより、画面がグレースケールになるか、すべてのアプリケーションでグレースケールになりませんが、システム環境設定の設定は更新されません。

MacOS High Sierra 10.13.6、clangバージョンでテスト済みApple LLVM version 10.0.0 (clang-1000.10.44.4)


理想的ではないことに同意します。Appleスクリプトソリューションを100%確実に動作させることができず、スクリプトの実行時に迷惑なポップアップが表示されます。launchctlを使用するには、セキュリティ保護を無効にする必要があり(IMOの方がはるかに悪い)、速度が遅くなります。もちろん、文書化されていない目的のC APIを使用することは、これを行うのに理想的な方法ではないことは言うまでもありませんが、このソリューションには他の方法にはない利点があり、UNIXコマンドラインインターフェイスに精通している人にとってはスクリプトが簡単です。
再帰的

2
これは素晴らしいです。私はあなたの実行可能ファイルを取り、Automatorを介して、それメイドサービス、およびそのサービスにキーボードショートカットを割り当てられ、基本的にグレースケールを切り替えるCmdを+オプション+ Ctrlキー+ 9をマッピング
しのばせる

4

[アクセシビリティ]パネルで変更された.plistファイルはに~/Library/Preferencesあり、それらはcom.apple.CoreGraphicscom.apple.universalaccessです。

のファイルは変更されません ~/Library/Preferences/ByHost

コマンドを実行します。

defaults write com.apple.universalaccess grayscale -bool yes

defaults write com.apple.CoreGraphics DisplayUseForcedGray -bool yes

次に、universalaccessdプロセスをアンロードおよび再ロードして、色を強制的にグレースケールに変更します。

launchctl unload /System/Library/LaunchAgents/com.apple.universalaccessd.plist

launchctl load /System/Library/LaunchAgents/com.apple.universalaccessd.plist

色に戻すには、defaultsパラメータをに設定して同じコマンドを実行しますno

瞬時に色を変更するアクセシビリティパネルとは異なり、この方法では移行に数秒かかる場合があります。


2.8 GHz Intel Core i7でテストし、bashスクリプトでラップすると、グレースケールを表示するためにスクリプトを実行してから10秒かかりました。ですから、「数秒」は誤解を招くと言わざるを得ませんが、とにかく+1です。
user3439894

おそらく、それをより速く実行する別のlaunchctlコマンドがありますか?3.4GHz Intel Core i7では、5〜6秒以上かかりませんでした。私はちょうどそれを計った。
IconDaemon

OPと他のユーザーがシェルスクリプトを独自に作成するために使用できるターミナルコマンドを提供していました。perlを使用してこれらのコマンドでスクリプトを作成し、Platypusでラップすることを好みます。人に魚を与える-彼らは一日食べるでしょう。魚の釣りを教えれば、空腹になることはありません。
IconDaemon

1
macOS 10.13.3 Betaでは、launchctlコマンドは次のエラーメッセージを生成しますOperation not permitted while System Integrity Protection is engaged。システム整合性保護を無効にすることもできます(こちらを参照)が、そうするとマルウェアに対する脆弱性が高まります。
パトリックブリニヒラングロワ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.