AppleScriptで「システム環境設定」のボタンをクリックさせたい

Macで、「システム環境設定」の「ディスプレイ」には、「ディスプレイを検出」というボタンが表示される。これを自動でクリックしたい。

f:id:Imamura:20091230151609p:plain

というのは、MacBookが閉じたままスリープから復帰してしまうことがあって、そうなると本体は閉じたままなので本体の液晶ディスプレイは復帰時に認識されず、MacBookを開いてもなにも表示されない。「ディスプレイを検出」をすると表示されるようになる。これが数日に一度くらい起きるので、「ディスプレイを検出」操作をなるべく自動化したいのだった。

(そもそもなぜMacBookが閉じたままスリープから復帰するのかも不明なのだが、それはさておいて)

今のAppleScriptは、アプリケーションのメニューやボタンを選択したりクリックしたりの操作ができる。これを「GUIスクリプティング」というらしい。調べながらいろいろやってみた。

結果、「システム環境設定」の「ディスプレイ」を呼び出すところまではできたのだけれど、最後の「ディスプレイを検出」ボタンをクリックするところだけできない。なぜだ。

tell application "System Preferences"
	activate
	set current pane to pane id "com.apple.preference.displays"
end tell

tell application "System Events"
	tell process "System Preferences"
		click radio button "ディスプレイ" of tab group 1 of window "LCD-MF221X" --「ディスプレイ/調整/カラー」の最初のペイン「ディスプレイ」を選択
		click button "ディスプレイを検出" of tab group 1 of window "LCD-MF221X" --「ディスプレイを検出」ボタンをクリックするはず(※ここでエラーが出る)
	end tell
end tell
--quit application "System Preferences" --デバッグが終わったらコメントから出す(すると、「システム環境設定」が閉じて終わる)

f:id:Imamura:20091230154025p:plain

問題の行に「of なんちゃら」がなにか足りないような雰囲気なのだけど、なにが足りないのかがわからない。

AppleScriptの側が、「ディスプレイを検出」ボタンがあることに気づいていないのかもしれない。というのは、「get every UI element of tab group 1 of window "LCD-MF221X"」をしたときの結果が以下であり、「回転:」のポップアップメニューなどは取得している一方、「ディスプレイを検出」ボタンが出てこないから。(改行はこちらで追加)

{radio button "ディスプレイ" of tab group 1 of window "LCD-MF221X" of application process "System Preferences" of application "System Events",
 radio button "調整" of tab group 1 of window "LCD-MF221X" of application process "System Preferences" of application "System Events",
 radio button "カラー" of tab group 1 of window "LCD-MF221X" of application process "System Preferences" of application "System Events",
 group 1 of tab group 1 of window "LCD-MF221X" of application process "System Preferences" of application "System Events",
 pop up button "回転:" of tab group 1 of window "LCD-MF221X" of application process "System Preferences" of application "System Events",
 static text "回転:" of tab group 1 of window "LCD-MF221X" of application process "System Preferences" of application "System Events"}

となると、解像度の変更や「ウインドウを集める」もAppleScriptからはできないのかもしれない。

外付けモニタの回転表示を制御するAppleScript

「回転:」のポップアップメニューを操作できるのならと、こんなのも作ってみた。

外付けモニタはふだん縦にして使っているが、横にしたいこともある。これもいちいち「システム環境設定」の「ディスプレイ」を呼び出さなくてもよいようにできないか。

一応できた。

--モニタを横にしたとき実行(「回転:標準」にする)
tell application "System Preferences"
	activate
	set current pane to pane id "com.apple.preference.displays"
end tell

tell application "System Events"
	tell process "System Preferences"
		click radio button "ディスプレイ" of tab group 1 of window "LCD-MF221X"
		click pop up button "回転:" of tab group 1 of window "LCD-MF221X"
		click menu item 1 of menu 1 of pop up button "回転:" of tab group 1 of window "LCD-MF221X"
	end tell
end tell

quit application "System Preferences"
--モニタを縦にしたとき実行(「回転:90°」にする)
tell application "System Preferences"
	activate
	set current pane to pane id "com.apple.preference.displays"
end tell

tell application "System Events"
	tell process "System Preferences"
		click radio button "ディスプレイ" of tab group 1 of window "LCD-MF221X"
		click pop up button "回転:" of tab group 1 of window "LCD-MF221X"
		click menu item 2 of menu 1 of pop up button "回転:" of tab group 1 of window "LCD-MF221X"
	end tell
end tell

ただこれも問題はあって、「回転:90°」にしたとき表示される確認のダイアログボックスの「確認」ボタンをクリックさせることができていない。

f:id:Imamura:20091230151608p:plain

どれも中途半端でもやもやするが、初めて使ったAppleScriptは楽しいことは楽しい。

Mac OS X 10.6のAppleScript開発は「AppleScriptエディタ」で

ところで、AppleScriptの開発・実行をなんという名前のアプリケーションで行うのか。10.6(Snow Leopard)では「AppleScriptエディタ」なのだけれど、これがわかるまで右往左往してしまった。

AppleScriptエディタ」は、「アプリケーション」−「ユーティリティ」内にあります。

http://gyazo.com/577088043bf7eee70c9c0367cdeb37e1.png

というのもこのソフト、「Script Editor」という名前だった時代もあるらしく、しかも最後のAppleScript解説書…いやいや、現在最新の解説書である『AppleScript Studioでゼンマイびゅんびゅん!!』(asin:4756142796、2003年発売、GUIスクリプティング登場前の本)では、「Script Editorは日本語への対応がよくないから」ということで「Project Builder」と「Interface Builder」が使われている。そして「Project Builder」は今は「Xcode」のことなのだった。

Xcodeでは、インターフェースを持つAppleScriptアプリケーションを作ることができる。そのあたりのことが書かれたページ。

AppleScript for OS X
http://www.kiwi-us.com/~mizusawa/penguin/html_hint/as_x/index.shtml

参考にした記事

AppleScript: Scriptable System Preferences
http://www.macosxautomation.com/applescript/features/system-prefs.html#1003《アップル本家のAppleScript解説サイトから、「システム環境設定」の操作の例》
備忘録 : メモ:AppleScriptGUIを操作する
http://www.measure-zero.jp/blog/2009/Feb/19《作例》
とくれせん無防備: AppleScriptことはじめ
http://nyoro2.blogspot.com/2009/07/applescript.html《作例》
マイキーボード計画、AppleScriptに挑戦した
http://www.kototone.jp/com/setkeyboard_applescript.html《作例》
AppleScript - 体調良くない、気分も鬱ぎ気味。 - 泡のようなBeerlog
http://d.hatena.ne.jp/tearus/20070218#1171810153《作例》
2009-03-08 - $ tail -f /var/log/yamaneko
http://d.hatena.ne.jp/yamaneko1212/20090308《作例。英語版のMac OS Xをお使いのもよう》
MacBookのメニューをショートカットで操作する試行錯誤 - ザリガニが見ていた...。
http://d.hatena.ne.jp/zariganitosh/20091202/1259791881Safariのメニュー項目を制御しようとする例》
UIElementInspector
http://developer.apple.com/mac/library/samplecode/UIElementInspector/index.html《ボタンなど各種のUIエレメントを調べられるソフト…らしいのだけれど、表示される名前はあまり参考にならない。ダウンロードしたzipの中に、ソース一式とともにビルド済みの.appも入っている》

そのほか、参考になるかもしれないリンク集

AS Hole(AppleScriptの穴) By Piyomaru Software
http://piyocast.com/as/《内容が高度すぎて、今の自分にはついていけない》
Applescriptサンプル
http://www.asahi-net.or.jp/~VA5N-OKMT/factory/applescript/sample_code/index.html《古典的なサンプル集》