6

プログラム内から Mac のカーソル サイズのシステム設定 ([アクセシビリティ設定] に表示) を設定し、プログラムが終了したら元に戻せるようにしたいと考えています。

アプリからカーソル サイズ (具体的には) またはシステム設定全般を設定する方法はありますか?

4

1 に答える 1

13

まず、カーソルがウィンドウ/ビュー/ウィジェットを指しているときに、より大きなカーソルを取得しようとしている場合は、これについて間違った言い方をしています。正しい方法については、Cursor Manager の紹介をお読みください。

次に、プログラムの実行中に実際にシステム全体のカーソルを設定したいと考えている場合でも、先に進む前により慎重に検討してください。アプリがバックグラウンドまたは非表示になっていても、カーソルは大きいままです。透過的なライフサイクルの考え方 (アプリが表示されていないことと、アプリが終了したことの違いをユーザーが通常気にするべきではないこと) に向けて何らかの動きをした場合、これはさらに混乱を招きます。2 つのアプリがこれを実行しようとすると、どうなりますか? 等々。(言うまでもなく、Apple はこれを行った App Store のアプリを拒否します。)

第 3 に、システム設定を設定しても、システムがその設定を読み取る新しい時刻まで、実際には何もしません。そして、それがいつ起こるかについての保証はありません。したがって、ユーザーがログアウトして再度ログインするまで有効にならない可能性がある設定を変更することにアプリが満足していない限り (そして、終了後に元に戻す)、それほど有用ではありません。

しかし、これが本当にやりたいことなら…</p>


システム設定の設定は非常に簡単です。システム環境設定によって変更された値のほとんどは、デフォルト ストレージにあります。[アクセシビリティ] ペインのほとんどの値はcom.apple.universalaccessドメインにあります。カーソル サイズの特定のキーはmouseDriverCursorSize.

したがって、bash からカーソルを最大サイズに変更するには:

defaults write com.apple.universalaccess mouseDriverCursorSize 4.0

ObjC からは少し面倒ですが、次のようなものです (未テスト):

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDictionary *olddict = [defaults persistentDomainForName:@"com.apple.universalaccess"];
NSMutableDictionary *newdict = [olddict mutableCopy];
[newdict setObject:@4.0 forKey:@"mouseDriverCursorSize"];
[defaults setPersistentDomain:newdict forName:@"com.apple.universalaccess"];
[defaults synchronize]

では、プリファレンスを設定して、システムに変更を強制的に通知させたい場合はどうすればよいでしょうか? 明らかに、システム環境設定アプリは何かを実行しており、いつでも追跡して、その実行内容を正確に確認できます。

多くの場合、文書化または公開されていないプライベート関数を呼び出します。また、OS のバージョンによって異なる場合があります。そして、それが行うことは、とにかく最善のことではないかもしれません. しかし、簡単なテストから:

CGSShowCursorカーソルが非表示になっている場合に非表示を解除することが許容される限り、呼び出しが機能するようです。CGSGetGlobalCursorDataなぜそれが必要なのかわかりませんが、続けて2回呼び出すこともうまくいくようです。

もちろん、これらは文書化も公開もされていない CGSPrivate 関数ですが、少なくとも他の人がそれらをリバース エンジニアリングしたので、その必要はありません。あなたがしなければならないことは、いくつかのオープン ソース プロジェクト ( iTerm2にはより完全なヘッダー セットの 1 つがあります) からコードを借りて、Apple からの新しいマイナー OS リリースごとにテストし、25 で機能しないブラック マジックをデバッグするだけです。残りの 75% は機能しますが、ユーザーの % は (25% が取得しているマシンにアクセスできず、通常、適切な質問や回答を得ることができません)。

システム環境設定をトレースしたいが、OS X でプロセスをトレースした経験がない場合、最も簡単な方法は GUI ツール Instruments を使用することです。

  • システム環境設定を起動し、アクセシビリティ、ディスプレイに移動します。
  • Xcode 4.4 以降を起動し、[Xcode] メニューに移動し、[Open Developer Tool]、[Instruments] の順に選択します。
  • Instruments で、「Mac OS X | All」セクションを選択し、次に「System Trace」を選択します。
  • 「ターゲット」プルダウンで、「システム環境設定」プロセスにアタッチします。
  • 「記録」ボタンをクリックし、ビーチボールが止まるまで数秒待ちます。
  • [カーソル サイズ] スライダをドラッグします。
  • 「停止」ボタンをクリックし、分析が完了するまでさらに待ちます。
  • Instruments の拡張ドキュメントを読んで、必要なものを見つける方法を理解してください。

ただし、システム環境設定は、必要なことを行うために特別なシステムコールを呼び出していない可能性があることに注意してください。たとえば、特定のマッハ メッセージを Window Server タスクに送信する場合などです。幸いなことに、可能性が高いと思われるものから後退することができます。こうすることで、 を呼び出してを送信するように見える関数であるUniversalAccessCoreUACursorSetScaleを呼び出しているように見えることがわかりました。たぶん、重要なのはその通知だけですか?Xcode/gdb/lldb の関連する関数にブレークポイントを設定し、パラメータを確認することでテストできます。または、自分自身を呼び出す方法を理解することもできます (私の最初の推測では、パラメーターは と同じです)。UAPreferencesSetValue/System/Library/PrivateFrameworks/UniversalAccess.framework/Versions/A/Libraries/libUAPreferences.dylibCFPreferencesSetValueCFNotificationCenterPostNotificationUAPreferencesSetValueCFPreferencesSetValue

簡単なチェックとして、送信される通知は「UniversalAccessDomainMouseSettingsDidChangeNotification」でありnil object、デフォルトの分散通知センターのuserInfoような辞書が@{@"mouseDriverCursorSize": @1.8327533, @"pid": @12345}あり、設定を変更した後に自分で同じことをしNSUserDefaultsても効果はありません. また、明らかな値を渡すと 内でクラッシュするため、UAPreferencesSetValue明らかに とは異なるパラメーターをとります。そのため、おそらくシステム環境設定で呼び出しをブレークポイントして、送信内容を確認する必要があります。CFPreferencesSetValueCFNotificationCenterPostNotification

この最初から快適に前進できるなら、それは素晴らしいことです。そうでない場合は、これを機能させることを検討する前に、学ぶべきことがたくさんあります。


これを行う別の方法は、スクリプトを作成することです。システム環境設定アプリをマウスと同じように動作させることができれば、それで問題ありません。

UIスクリプトが有効になっている限り(システム環境設定ですでに見ているのと同じペインにある「補助デバイスへのアクセスを有効にする」チェックボックスを参照するか、ルートアクセス権がある場合はプログラムでオン/オフする方法をググってください)、それは面倒ですが、システム イベントを介して簡単に実行できます。

実際、システム環境設定は実際に何かを変更するのに十分な詳細を公開していません、適切なペインにナビゲートするのに十分な情報を公開しているため、多くの UI スクリプト手順を節約できます. だから、ここにあなたが望むことをするAppleScriptがあります:

tell application "System Preferences"
    reveal anchor "Seeing_Display" of pane id "com.apple.preference.universalaccess"
end tell
tell application "System Events"
    set theSlider to slider "Cursor Size:" of group 1 of window 1 of application process "System Preferences"
    set stash to value of theSlider
    set value of theSlider to 4.0
    stash
end tell

それを ObjC から実行するか、必要に応じて、 、、またはネイティブに実行できる別の何かNSAppleScriptに変換して、完了です。ScriptingBridgeAppscript

于 2013-01-25T01:35:51.520 に答える