objc-appscriptフレームワークはいたれりつくせり

(続き)

で、肝心の使い方なんですがobjc-appscript FrameworkではAppleScript対応アプリを制御するためのGlueクラスが必要になります。このglueクラス作成のためのツールが、binディレクトリに収納されてている、osaglueになります。このosaglueの中身はpythonスクリプトで実行にはpy-appscript/py-osaterminologyのインストールが必要です。objc-appscript/installページにあるとおり最新版を取得してインストールします。これで準備完了。例えば、Mail.appのglueクラスを作成するには、

osaglue -o MLGlue -p ML /Applications/Mail.app

これでMLGLueディレクトリにML**のglueクラスが生成されますので後は自分のプロジェクトにFrameWrokと一緒にこのグルークラスを追加すればOK。ScriptingBridgesではsdef/sdpツールを使ってヘッダを生成しましたがイメージとしてはこれと同じです。

さて、objc-appscript Frameworkのスゴイところは、glueクラスを作ったはいいけれどどういう風に使ったらいいのかわからない!?という僕のようなヘタレのためにASTransrateというツールまで用意されているのところ。実現したいapplescriptコードをglueクラスを使った実装に変換してくれます。僕がやりたかったのは”システムイベントとしてコマンド+vを送信する”ということなので

tell application "Numbers" to activate
tell application "System Events"
	tell process "Numbers" to keystroke "v" using command down
end tell

といapplescriptを書いてASTransrateで変換すると、なんと、

// To create glue:  osaglue  -o NUGlue  -p NU  Numbers
NUApplication *numbers = [NUApplication applicationWithName: @"Numbers"];
id result = [[numbers activate] send];

// To create glue:  osaglue  -o SEGlue  -p SE  System Events
SEApplication *systemEvents = [SEApplication applicationWithName: @"System Events"];
SEReference *ref = [[systemEvents processes] byName: @"Numbers"];
SEKeystrokeCommand *cmd = [[ref keystroke: @"v"] using: [SEConstant commandDown]];
id result = [cmd send];

というコードに変換してくれました。例ではアプリケーションはNumbers決めうちですが、プログラムでは何が対象のアプリケーションになるかわかりませんが、そこは

NSDictionary* activeApp =
 [[NSWorkspace sharedWorkspace] activeApplication];

で、取得できることは調べ済みなので変換されたコードをチョット直してコピペで完了です。

NSDictionary* activeApp = 
  [[NSWorkspace sharedWorkspace] activeApplication];
SEApplication *systemEvents = 
  [[SEApplication alloc] initWithName:@"System Events"];
SEReference *ref = 
  [[systemEvents processes] byName:[activeApp valueForKey:@"NSApplicationName"]];
SEKeystrokeCommand *cmd = 
  [[ref keystroke: @"v"] using: [SEConstant commandDown]];
[cmd send];
[systemEvents release];

なお、ASTransrateが変換してコードのコメントに

// To create glue:  osaglue  -o SEGlue  -p SE  System Events

というのがありますが、System Eventsのところはダブルクウォートで囲まないとうまくいきません。あと、フレームワーク自体のターゲット設定でインストールディレクトリが${HOME}/Library/Frameworksになっているのでここを"@executable_path/../Frameworks"を修正する必要がありました。

それにしてもこのappscriptのプロジェクトのツール充実ぶりには感動しました。pythonやろうかなぁ〜。みたいな。

と、言うわけで調子に乗ってclippyダウンロードページを作りましたので、こちらからダウンロードしてお試しください。

この記事のトラックバックURL:

http://hippos-lab.com/blog/trackback/275

Comments