ウィンドウをモニターする その2その1ではウィンドウを監視してアプリケーションの起動状態をバーに表示する、という使い方を説明しました。 今度は特定のアプリケーションが起動したらそれに必要なツールを起動させ、アプリケーションが終了したらツールを終了させる、 という使い方を説明します。例えばブラウザが起動したらProxomitronを起動させ、ブラウザが終了したらProxomitonを終了させる、 といった使い方ができます。今回はそれを例にとって説明していきましょう。もちろん使うのはその1で使ったモニタリング機能です。違うのは「monitor」というコマンドリストの中で走らせるスクリプトだけです。 その1では「指定したウィンドウがあったらバーのボタンの色を変える」というスクリプトを作りました。今回は「指定したアプリケーション が起動してたらツールを起動させ、指定したアプリケーションが起動していなかったらツールを終了させる」というスクリプトを作ります。 さて早速さっき言った「指定したアプリケーションが起動してたらツールを起動させ、指定したアプリケーションが 起動していなかったらツールを終了させる」というスクリプトを作るわけですが実際作るスクリプトはもっと条件が厳しいです。 と言うのは「指定したアプリケーションが起動していたら」という条件だけでは、そのアプリケーションが起動したときすでにツールが起動して いた場合は2重起動してしまうことになります。そこで指定したアプリケーションが起動したときツールが起動していないかも調べさせます。 つまり「指定したアプリケーションが起動していて、かつツールが起動していなかったら」という条件になります。 後半部の「指定したアプリケーションが起動していなかったら」という条件も十分ではありません。指定したアプリケーションが起動していない とき、ツールが起動していない可能性があるからです。アプリケーションを終了させる場合*Window Closeコマンドを使うのですが 、このコマンドを実行したとき対象となるウィンドウがない場合エラーメッセージを出したりしません(オプションで出すこともできます)。 なのでツールを終了させるために*Window Closeコマンドを使ったときそのツールが起動していなくても特に問題にはならないと思います。 しかし気持ちが悪いのでちゃんとツールが起動しているときのみに*Window Closeコマンドを使うようにします。つまり後半部の条件は 「指定したアプリケーションが起動していなく、かつツールが起動しているならば」となります。 今回例として使う「Internet Explorerが起動したときにProxomitronを起動させ、Internet Explorerが終了したらProxomitronを終了させる」という動作 をさせるには「もしInternet Explorerが起動していてかつProxomitronが起動していなければProxomitronを起動させ、Internet Explorerが 起動してなくてかつProxomitronが起動していればProxomitronを終了させる」というスクリプトを作ればいいのです。 それではスクリプトを作りましょう。最初からそのスクリプトを見せます。(今まで*Window closeを使ってましたがうまくいかないので *Window close2に変えました)。 ;Internet Explorerが起動していてかつProxomitronが起動していなければProxomitronを起動 if( (anywindow "=iexplore") & (anywindow "=Proxomitron" ==0) )do C:\(Proxomitronへのパス)\Proxomitron.exe ;Internet Explorerが起動してなくてかつProxomitronが起動していればProxomitronを終了 elseif( (anywindow "=iexplore" ==0) & (anywindow "=Proxomitron") )do *window close2 "=Proxomitron" endif前回のようにif〜などが使われていますが、ifのあとの( )の中が前回より複雑になっています。 また使われいているifの構文も微妙に前回と違います。 まず1行目の if( (anywindow "=iexplore") & (anywindow "=Proxomitron" ==0) )do からです。 ifのあとの( )の中にanywindowが二つ使われています。これは2種類のアプリケーションの起動状態を調べる必要があるからです。 anywindowのあとの" "の中がどちらも"=〜"という形をしています。前回anywindowというキーワードを使ったときはウィンドウの キャプションを指定しました(*winamp*など)。今回は名指しでアプリケーションの実行ファイル名を指定しています。つまり =(イコール)のあとの文字列はアプリケーションの実行ファイル名です。ただし拡張子(.exe)はつけません。今回の例では Internet Explorerの実行ファイル名 iexplore とProxomitronの実行ファイル名 Proxomitron を指定しています。 このようにターゲットを実行ファイル名で指定することもできます。もちろんここでキャプション(*internet explorer*)と 指定してもかまいませんがアプリケーションを確実に指定するときは実行ファイル名で指定することをお勧めします。 さてここでは (anywindow 〜) & (anywindow 〜) のように2種類の起動状態を調べるキーワードの間に & が挟まれています。 これが「Internet Explorerが起動していてかつProxomitronが起動していなければ」という条件の「かつ」を意味します。 つまり前後にある条件が両方とも満たされなければならないということです。 anywindow "=Proxomitron"のあとに ==0 とあります。これは「Proxomitronが起動していない」かを調べるためのものです。 今まであまり説明しませんでしたが「起動していれば」という条件にしたいときは「anywindow "〜"」だけで 十分でした。ここでも「Internet Explorerが起動していれば」は「anywindow "=iexplore"」だけで済んでいます。それでは 「もし起動していなければ」という条件はどうすればいいのでしょうか?実は anywindow "〜" は"〜"のアプリケーションが 起動していないとき 0(ゼロ)と同じ意味になります。だから起動してないならば、を表現するには anywindow "〜" == 0 とするのです。 ここで == のように =(イコール)が二つ並ぶのはおかしいと思った人もいるかもしれませんがこれは同値であることを調べるための 表現でそういうもんだと思ってください(C言語などを勉強したことがある人はすぐわかると思います)。 これで大体1行目の「Internet Explorerが起動していてかつProxomitronが起動していなければ」という条件がわかったでしょうか。 そのあとの2行目の「C:\(Proxomitronへのパス)\Proxomitron.exe」はProxomitronを実行させるだけの行です。 今度はifの構文を見てみましょう。前回は if〜else〜endif という形を使いました。今回は if〜elseif〜endif となり else がelseif に なっています。
if( 文A )do
文B
elseif( 文C )do
文D
endif
elseとelseifの違いは、elseはそのあとに条件をとらないがelseifはそのあとに条件をとる、という違いがあります。上の構文では
elseのときと違い"文C"という条件があります。この構文の意味は「もし"文A"ならば"文B"を実行し、"文A"でなく"文C"ならば"文D"を
実行する」となります。elseの場合は"文A"でなければ問答無用でelseのあとのendifまでの行を実行します。しかしelseifを使ったときは
"文A"でなかったとき、さらに"文C"の条件を調べてそれが正しければそのあとの行を実行します。つまり"文D"は場合によっては実行されない
時があるということです。次にelseifのあとの( )の中を見てみます。(anywindow "=iexplore" ==0) & (anywindow "=Proxomitron") とありますがこれは 最初の行のifのあとの( )の中を逆にしただけです。よく比較してみてください。今度は "=iexplore" のあとに ==0 が付いています。 最初の条件とは逆で「Interet Explorerが起動していなくてかつProxomitronが起動していれば」という条件になります。 大体スクリプトの意味がわかったでしょうか。それではアプリケーションの起動状態でどうなるかをまとめてみましょう。
このスクリプトはアプリケーションの起動状態で上の表のような動作をするはずです。このアプリケーション起動状態を 毎秒調べることで監視することになります。意外に単純であることがわかりますね。 これでスクリプトができました。これを「monitor」コマンドリストに追加すればいいのですが、このあとが肝心です。 その1でも注意事項として書きましたが「monitor」に追加してモニタリング機能を有効にする前に必ずテストをおこなってください。 つまりこのスクリプトを適当なホットキーなどに割り当て1回だけ実行してみてください(*Script RunFileです)。先の表の起動状態のときに意図したとおりの 動作を行えば成功ですが、文法エラーや意図しない動作をする可能性があります。例えば今回の例ではInternet Explorerだけ 起動させてスクリプトを実行してみたときちゃんとProxomitronが起動するか、などを確認します。 その1の例ではアプリケーションを起動させるコマンドはなかったのでスクリプトをちょっと間違えても大きな問題にはなりませんでした。 しかし今回はアプリケーションを起動させるコマンドが含まれています。下手をすると毎秒Proxomitronが起動するハメになります。 こうなっては大変です。だから必ずモニタリングさせる前にアプリケーションの起動状態に合わせてそれぞれ1回ずつ試してみてください。 意図したとおりの動作をするか確認してから「monitor」コマンドリストに追加してください。 ちなみに今回のスクリプトは結構文法エラーを出しやすいです。全く同じ動作をさせたいときはできる限り上のスクリプトをそのまま コピーしてメモ帳などに貼り付け、" "の中やアプリケーションへのパスだけを変えて使うことをお勧めします。 スクリプトができたらあとはその1のときと同じなので説明は省きます。 ※実はこれまで説明してきたことはもっと負荷をかけずに同じ動作をさせることができます。「Open」スペシャルリストと *Wait nowindowやnopathコマンドなどを組み合わせると同じことができます。スクリプト8(*Waitコマンド)を見てください。 トップに戻る その1へ |