回答:
注:サンプルの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
これには、目的の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)
。
[アクセシビリティ]パネルで変更された.plistファイルはに~/Library/Preferences
あり、それらはcom.apple.CoreGraphics
とcom.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
。
瞬時に色を変更するアクセシビリティパネルとは異なり、この方法では移行に数秒かかる場合があります。
launchctl
コマンドは次のエラーメッセージを生成しますOperation not permitted while System Integrity Protection is engaged
。システム整合性保護を無効にすることもできます(こちらを参照)が、そうするとマルウェアに対する脆弱性が高まります。
delay 1
クリックチェックボックスの前に追加した後に機能しました。ありがとう!