4

私の Mac OSX アプリケーションでは、ボタンがクリックされたときに画面の右上隅にあるシステム クロックを削除する機能があります。表示されるシステム メニュー (システム クロックを含む) を制御する設定は、~/Library/Preferences/com.apple.systemuiserver.plist に保存されます。そのファイルの関連する設定を更新して、システム クロックを削除することができました。ただし、SystemUIServer アプリケーションを再起動して、新しい設定を再読み込みし、時計を削除できるようにする必要があります。SystemUIServer を再起動するために使用したコードを次に示します。

NSTask *killSystemUITask = [[NSTask alloc] init];
NSMutableArray *args = [NSMutableArray array];
[args addObject:@"SystemUIServer"];
[killSystemUITask setLaunchPath:@"/usr/bin/killall"];
[killSystemUITask setArguments:args];
[killSystemUITask launch];

SystemUIServer が強制終了されると、OSX は自動的に再起動します。上記のコードは機能しますが、システム クロックの削除は私が望むほどクリーンではありません。システム バー全体が 1 秒間削除されます。設定を SystemUIServer にリロードするより良い方法を考えられる人はいますか? 理想的には、システム クロックを削除して、システム環境設定アプリケーションの日付と時刻の設定にある時計表示機能と同じくらいきれいにしたいと考えています。

4

1 に答える 1

2

AppleEvents/OSAScript を使用して設定ペイン自体を操作しようと考えたことはありますか? Network prefs ペインは完全に組み込みのスクリプト機能を備えた唯一のペインのようですが、System Events を使用して任意の UI を操作できます。AppleScript でプロトタイプを作成するのは簡単でした。これが私が思いついたものです:

tell application "System Preferences"
    reveal pane "Date & Time"
    reveal anchor "ClockPref" of pane "Date & Time"
    tell application "System Events"            
        tell tab group 1 of window 1 of process "System Preferences"
            repeat with cbIndex from 0 to count of checkboxes
                tell checkbox cbIndex
                    if title contains "menu bar" then
                        click
                        exit repeat
                    end if
                end tell
            end repeat
        end tell
    end tell
    quit
end tell

NSAppleScript オブジェクトを使用してそのまま使用することも、自虐的であると感じている場合は、送信するのに適切な AppleEvents を見つけるという詳細に飛び込むこともできます。(正気を保つために前者のアプローチをお勧めしますが、後者の方が実行時の実行速度が速くなります。)

長所:簡単。

短所:システム環境設定を起動します(Dockで跳ね返っているように見えます)、「補助デバイスのアクセスを有効にする」を有効にする必要があります(他の多くのものと同様)

これがSystemUIServer を強制終了するよりも視覚的に良いか悪いかを言うのは難しいですが、SystemUIServer と対話している可能性のある他のコンポーネントに対してはほぼ確実に親切です。

ドックのバウンスを取り除く限り、ここのこの質問では、ドックアイコンなしで物事を起動する方法について言及しています. これに付け加えることができるのは、過去に私がこの問題と格闘したことがあるということです。

  • 一意の安全な一時ディレクトリを取得する
  • 問題のアプリのバンドル全体のハードリンクのみのミラーを作成します (pax -rwlこれに役立ちます)
  • ハードリンクされた Info.plist を実際の Info.plist のコピーに置き換えます
  • 他の質問の指示に従ってコピーを編集します。(注: ここで設定する以外のオプションもありますがNSUIElement = true、読者と Google の課題として残します。)
  • 一時ディレクトリからアプリケーションを使用する
  • 一時ディレクトリを削除します。

このアプローチは、サードパーティのアプリケーションを動かそうとしたときに非常に堅牢であることが証明されました. 将来、署名/サンドボックス化されたシステム アプリケーションで問題が発生する可能性があると思います。(つまり、Info.plist を変更すると署名が変更され、実行を拒否される可能性があります。) また、当然のことながら、サンドボックス化されたアプリには、AppleEvents を送信するための特定の権限または例外が必要ですが、これはシステム プロセスの強制終了にも当てはまると思います。 (サンドボックス化されたアプリからそれが可能であれば。)

最後に、これが重要であると思われる場合は、Apple にバグ レポートを提出して、ファースト クラスの API またはスクリプト機能を要求する必要があります。

于 2011-12-28T15:38:12.113 に答える