1|2|3|4キー・ストロークの送信:SendKeysメソッドCOMオブジェクトとして利用できる外部Windowsプログラムは、WSHスクリプトから直接操作できるが、そうでないWindowsプログラムをスクリプトで操作するには、プログラムを起動しておき、スクリプトからキー・ストロークを送信して、擬似的にプログラムがキーボードから操作されたように制御する。これに使えるのがWshShellオブジェクトのSendKeysメソッドとAppActivateメソッドである。・SendKeysメソッド(WSHリファレンス)SendKeysメソッドは起動されているプログラムにキー・ストロークを送信するメソッドである。SendKeysメソッドを利用してキー操作をエミュレートすれば、ほとんどのWindowsプログラムを操作できる。問題は、制御の可否が時間的なタイミングに大きく影響を受けることだ。これは例えば、プログラムからダイアログ・ボックスをポップアップ表示して、[OK]ボタンを押すという操作を考えればすぐ分かる。基本的には、プログラムの本体にメニュー操作用のキー・ストロークを送信してダイアログを表示させ、次に[Enter]キーを送信して[OK]ボタンを押せばよい(多くのダイアログでは、標準で[OK]ボタンに入力フォーカスが設定されている)。ダイアログが表示されるよりも早く[Enter]を送信してしまうと、これは正しく処理されない。このため多くの場合スクリプトのプログラマは、キーの送信を行うタイミングを実行環境(コンピュータの性能など)に合わせて試行錯誤しながら設定しなければならない。時間的なタイミングばかりでなく、スクリプトの実行中にユーザーがほかのプログラムをアクティブにしてしまったりすると誤動作することがある。実行時オプションや標準入出力を利用するこれまでの方法に比べると不安定な要素が大きい。従って安易にSendKeysメソッドに頼るのではなく、プログラムを制御する別の方法がないかを検討することが望ましい。SendKeysメソッドのパラメータはプログラムに送信するキー・ストロークに対応する文字列である。SendKeysメソッドを実行すると、パラメータに指定した文字列がその時点でアクティブなウィンドウに送信される。次は、メモ帳を起動し、起動処理が完了するまで1秒間待ち、“hello”と書き込むスクリプトである。SendKeysメソッドでは、日本語などの2バイト文字を送信することはできない。"hello"SenKeysメソッドでメモ帳に“hello”と書くスクリプトShiftやCtrlキーなどの特殊キーには特別な文字列が割り当てられており、これを指定することで対応する特殊キーをプログラムに送信できる。}でくくって{^}のようにする)。}(中カッコ)を使って指定する。Spaceは{BACKSPACE}または{BS}、{BKSP}という具合である。詳細は前出のSendKeysメソッドのリファレンスにまとめられている。特殊キーの記述方法一覧を以下に示す。(F3〜F12も同様){F2}特殊キーの記述方法ShiftやCtrl、Altなどは、ほかのキーと組み合わせて使われるものだ。[Ctrl]+[C]なら、「^c」のように記述する。「%FO」なら、Altキーを押したままFキーを押し、Altキーを離してOキーを押すことを表すが、「%(FO)」ならAltキーを押したままF、Oの2つのキーを連続して押すことを表す(多くのWindowsプログラムのメニューであれば、どちらの方法でも「ファイル(F)」−「開く(O)」メニューを実行できる)。10}」のように記述すれば、Xキーを10回送信することができる。5}」と記述すれば5回下カーソルキー(↓)を送信することができる。ここで例として、test.txtをメモ帳で開き、最初に「WSH」が登場する行をクリップボードにコピーし、メモ帳を終了するコードを作ってみよう。具体的にはメモ帳を起動し、検索ダイアログを表示し、“WSH”という文字列の検索を実行し、文字列が見つかった行の先頭から選択してクリップボードにコピーしてメモ帳を終了する。Alt+F4で終了メモ帳をキー・ストローク送信で操作するスクリプトスクリプトでは、最初にRunメソッドによりtext.txtを開き、その後の操作を順にSendKeysで送信している。最初の起動では1秒(3行目)、検索ダイアログの表示とダイアログを閉じる部分ではそれぞれ0.1秒ずつ待ち時間を設けている(5行目と8行目)。後半の処理の途中でも待ち時間を設定すれば、実際に行われている動作が目で追えるので面白いかもしれない。プログラムのアクティベーション:AppActivateメソッド上の例では、アクティブなプログラムに対してキーを送信し続けるため、ユーザーの操作などで、途中で別のウィンドウがアクティブになってしまうと、そのウィンドウに対してキーを送信してしまい、正常に動作することができない。起動までの時間を1秒と決めているので、それ以上起動に時間がかかった場合も問題が生じる。このような問題を少しでも解消するために、SendKeysを使う場合にはその直前にAppActivateメソッドを用い、キーを送信したいウィンドウをアクティブにしておくことが望ましい。AppActivateメソッドは、ウィンドウ・タイトルの文字列、もしくはプロセスIDを指定することで、そのアプリケーション・ウィンドウをアクティブにするメソッドである。タイトルは完全に一致する文字列でなくても、最初から途中まで、もしくは途中から最後までの文字列を指定するだけでもよい。実行時には、完全に一致するもの→先頭が一致するもの→末尾が一致するものの順に検索される。いくつものウィンドウがヒットした場合には、そのうちのどれがアクティブになるかは決まっていない。一方のプロセスIDは、Execを使って起動したプログラムでは、WshScriptExecオブジェクトのProcessIDプロパティから取得できる。AppActivateメソッドは、実行に成功すればTrueを、失敗すればFalseを返す。この戻り値を利用して、成功するまで待つことができる。先ほどの例を書き直せば次のようになる。Alt+F4で終了AppActivateメソッドを利用して、4行目でメモ帳の起動完了を待ち、9行目で検索ダイアログの表示完了を待ち、15行目でメモ帳本体のウィンドウを再度明示的にアクティブにしている。このようにAppActivateを挿入することで、意図しないウィンドウへキーを送ることを防ぎ、スクリプトの安全性を高めることができる。次回も引き続き、WshShellオブジェクトのメソッドとプロパティについて解説する。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。