터미널 / 앱을 통한 접근성에서 그레이 스케일 모드를 활성화 / 비활성화하는 방법은 무엇입니까? 프로세스가 무엇인지

시스템 환경 설정의 접근성 패널에서 그레이 스케일 모드를 활성화 / 비활성화하는 프로세스가 무엇인지 궁금합니다.

Dock에서 응용 프로그램을 클릭하거나 터미널 명령으로 간단한 스크립트를 실행하고 그레이 스케일에서 일반 모드로 전환하고 싶습니다.

어떤 아이디어?



답변

참고 : 예제 AppleScript 코드는 현재 최신 macOS (Mojave)를 처리하고 코드 개선 사항을 추가하도록 업데이트되었습니다. 이전 버전의 OS X / macOS of group 1에서는 코드가 작동하기 위해 AppleScript 코드가있는 두 줄의 예제 를 제거해야 할 수도 있습니다 .


Dock에 넣을 AppleScript 응용 프로그램을 만들려면 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

스크립트 편집기에서 파일 형식을 다음으로 변경하여 Toggle Grayscale로 저장합니다.

앱 정보 입수 시트의 아이콘에 복사하여 붙여 넣기를 통해 앱에 다른 아이콘을 부여한 다음 앱 번들을 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/Preferencescom.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.

색상을 즉시 변경하는 액세스 가능성 패널과 달리이 방법을 전환하는 데 몇 초가 걸릴 수 있습니다.