ページ

2008年8月14日木曜日

アプリケーション起動完了を捉える (2)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

NSWorkspace の メソッドを眺めていると他にもアプリケーション起動のメソッドが見つかった。


Launch Options

enum {
NSWorkspaceLaunchAndPrint = 0x00000002,
NSWorkspaceLaunchInhibitingBackgroundOnly = 0x00000080,
NSWorkspaceLaunchWithoutAddingToRecents = 0x00000100,
NSWorkspaceLaunchWithoutActivation = 0x00000200,
NSWorkspaceLaunchAsync = 0x00010000,
NSWorkspaceLaunchAllowingClassicStartup = 0x00020000,
NSWorkspaceLaunchPreferringClassic = 0x00040000,
NSWorkspaceLaunchNewInstance = 0x00080000,
NSWorkspaceLaunchAndHide = 0x00100000,
NSWorkspaceLaunchAndHideOthers = 0x00200000,
NSWorkspaceLaunchDefault = NSWorkspaceLaunchAsync | NSWorkspaceLaunchAllowingClassicStartup
};


これを見るとデフォルト(NSWorkspaceLaunchDefault)に非同期起動(NSWorkspaceLaunchAsync)が含まれている。ということはこのオプションを付けなければ同期起動(アプリ起動完了まで待つ)ということか。

早速試してみる。
[[NSWorkspace sharedWorkspace]
launchAppWithBundleIdentifier:@"com.apple.dashboardlauncher"
options:0 additionalEventParamDescriptor:nil launchIdentifier:nil]


以前の #launchAppliction: と異なり、アプリケーションを BundleIdentiferで指定する必要がある。Dashboardは "com.apple.dashboardlauncher"だった。

実行結果は意図通り。sleepでタイミングを計らなくともキャプチャが動作するようになった。

- - - -
ただそれでもタイミングによる微妙な問題が残っているため結局 0.5秒のディレイを入れてある。これは Dashboard起動時に Widgetが画面の外から入ってくるようなアニメーションを行なうが、このアニメーション中にキャプチャ処理が開始されるとアニメーション途中のウィンドウがキャプチャ対象になってしまうため。使っている環境によってはこの 0.5秒では足りないかもしれない。うーむ。