Windows Script Host のオブジェクトモデルの奥深くに、SendKeys と呼ばれる小さくも強力なメソッドが隠されています。このメソッドを使うと、キーボードで手動で入力したかのように、アクティブなウィンドウにキーストロークを送信できます。SendKeys メソッドのプログラミングは、そのルールと使い方を理解すれば比較的簡単で、これまで繰り返し作業に費やしていた何時間もの時間を文字通り節約できます。
このDaily Drill Downでは、SendKeysメソッドの仕組みを詳しく説明し、繰り返し作業を自動化するためのSendKeysマクロの作成方法をご紹介します。最後に、ITプロフェッショナルがSendKeysメソッドの使用に関して抱く最大の不満の一つを回避する方法をご紹介します。
ネイティブ マクロ機能の履歴について詳しくは、ここをクリックしてください。
SendKeysの登場
マイクロソフトが1999年にWindows Script Host 2.0を導入した際、オブジェクトモデルにSendKeysという新しいメソッドが追加されました。その名前が示すように、SendKeysメソッドは、スクリプト内から、キーボードから入力したかのように、あらゆるキー操作をアクティブなウィンドウに送信できるように設計されています。SendKeysはキーボードのみで動作しますが、通常マウスで行う操作の多くをキーボードから手動で実行できることを覚えておいてください。
SendKeysメソッドは、非常に使いやすくマクロのようなツールを提供し、しかもWindowsオペレーティングシステムに組み込まれているのが最大の利点です。Windows XPにはWindows Script Host 5.6が付属しており、前バージョンと同様にSendKeysメソッドが含まれています。
Windows Script Host パッケージのダウンロード
Windows Script Host 5.6はWindows XPに組み込まれていますが、Windows 98/MEまたはWindows 2000をお使いの場合は、最新の機能強化をすべて活用するために、必ず最新バージョンにアップグレードしてください。Windows Script Host 5.6パッケージは、MicrosoftのMSDNライブラリサイトのWindows Scriptセクションからダウンロードできます。Windows Script 5.6のダウンロードセクションへのリンクをクリックしてください。(パッケージにはWindows 2000用とWindows 98/MEおよびWindows NT 4.0用の2つのバージョンがあることにご注意ください。)ダウンロードの際に、Windows Script Host 5.6ドキュメントもダウンロードしてください。これは実行可能なインストールファイルで、コンパイル済みのヘルプファイルがインストールされます。
SendKeysの構文
SendKeysメソッドを使ってマクロを作成する前に、その構文を理解しておく必要があります。幸いなことに、SendKeysメソッドの構文は非常に簡単です:
WshShell.SendKeys “string”
この場合、WshShell は、すべてのスクリプトの始めにインスタンス化する必要がある標準の Windows Script Host Shell オブジェクト変数であり、string はアプリケーションに送信するキーストロークです。
キーボード上の標準文字を送信するには、文字を引用符で囲んで文字列として送信するだけです。例えば、文字zを送信したい場合は、 WshShell.SendKeys “z”という形式を使用します。
同様に、フレーズを送信する場合は、
WshShell.SendKeys “Hello World!”という形式を使用します。
ほとんどの場合、SendKeysメソッドは、特殊キー[Ctrl]、[Alt]、[Shift]を利用した複合キー入力を生成するために使用します。これらの特殊キーを表すために、SendKeysメソッドは表Aに示す文字を使用します。
表A |
![]() |
特殊キーを表す文字 |
たとえば、現在のファイルを保存するためにアプリケーションにコマンド[Ctrl]Sを送信する場合は、次の形式を使用します:
WshShell.SendKeys “^s”
標準文字と特殊キーに加えて、[Enter]キーやファンクションキーなど、他にも使いたいキーがたくさんあります。これらのキーを送信するには、括弧で囲む一連のコードを使用します。これらのコードは表Bに記載されています。
表B |
![]() |
特殊キーを表すコード |
注記
奇妙なことに、Microsoft は Windows キーにアクセスできるようにする特別なコードを SendKeys メソッドに追加しませんでした。
コンパニオンメソッド
SendKeys メソッドは強力なツールですが、マクロ実行に必要なすべての機能を備えているわけではありません。幸いなことに、Windows Script Host には、その不足を補う強力なコンパニオンメソッドがいくつか用意されています。
AppActivateメソッド
まず、SendKeysメソッドは、現在フォーカスがあるウィンドウにキーストロークを一斉送信するだけであることを理解することが重要です。これは、SendKeysマクロで自動化したいタスクとは異なる場合があります。目的のウィンドウがキーストロークを受け取るようにするには、AppActivateメソッドを使用します。その名前が示すように、AppActivateメソッドは、特定のアプリケーションまたは指定した開いているウィンドウ(ダイアログボックスを含む)にフォーカスを移動するために設計されています。この処理を行うために、AppActivateメソッドは次の構文を使用します:
WshShell.AppActivate title
ここで、title は、フォーカスを当てたいアプリケーションまたはダイアログボックスのタイトルバーに表示される名前を含む文字列です。タイトルの一部または全体を使用できます。
ウィンドウがバックグラウンドにある場合、AppActivateメソッドはウィンドウをフォアグラウンドに表示し、何が起こっているかを確認します。一方、ウィンドウが最小化されている場合、AppActivateメソッドはウィンドウを現在の位置に維持したまま、フォーカスをそのウィンドウに移動します。
AppActivateメソッドを使用する際には、いくつか注意すべき点があります。アプリケーションが複数のウィンドウを開いており、それらすべてに同じタイトルが付いている場合、AppActivateメソッドは最初に見つかったウィンドウを取得します。アプリケーションが実行中でない場合、または指定したタイトルのウィンドウが存在しない場合、AppActivateメソッドは、そのタイトルの単語を含むウィンドウを取得するか、スクリプトが終了するまでバックグラウンドで待機します。そのため、AppActivateメソッドでタイトルを指定する際は、非常に詳細に指定することが重要です。
Sleepメソッド
Sleepメソッドは、スクリプトの実行を一定時間一時停止するように設計されています。AppActivateメソッドでウィンドウを選択してから、SendKeysメソッドで自動化するまでの間に、Sleepメソッドを使用します。これにより、SendKeysメソッドがキーストロークの送信を開始する前に、AppActivateメソッドがウィンドウを確実に取得できるようになります。
SleepメソッドはWshShell.Sleep timeという構文を使用します。
ここで、time はミリ秒を表す整数値です。例えば、1000 は 1 秒に相当しますが、これは SendKeys マクロの作成時にスクリプトを一時停止させるにはかなり長い時間です。一般的には、100 から 500 の範囲の値を使用すれば十分です。
Run メソッド
現在実行されていない SendKeys マクロを介してアプリケーションを自動化する場合は、Run メソッドを使用して実際にアプリケーションを起動できます。
Runメソッドは、次の構文を使用します:
WshShell.Run(executable, [WindowStyle], [Wait])
ここで、executable はアプリケーションの実行ファイルへのパスと名前です。WindowStyleパラメータとWaitパラメータはオプションで、それぞれウィンドウのサイズと位置、およびアプリケーションが閉じられるまでスクリプトを一時停止するかどうかを制御できます。ほとんどの場合、executableパラメータを使用するだけで十分です。
ファイル形式
典型的なSendKeysマクロは、Windows Script Hostメソッドのみを使用します。つまり、VBScriptやJscriptなどのスクリプト言語のステートメントを必ずしも含むわけではありません。ただし、SendKeysマクロにはVBScriptまたはJscriptファイル形式を使用し、VBSまたはJS拡張子でファイルを保存する必要があります。
SendKeys マクロの作成
SendKeys マクロを使用して自動化するタスクを決定したら、キーボードを使用してタスクを手動で実行し、使用する各キーストロークと、タスクの実行中に表示されるウィンドウ/ダイアログ ボックスのタイトルをメモする必要があります。
例えば、Windows XPの「最近使ったドキュメント」リストをクリアする手順を自動化したいとします。ご存知のとおり、「リストをクリア」ボタンは「タスクバーとスタートメニューのプロパティ」ダイアログボックスの奥深くに隠れています。そのため、SendKeysマクロを使用してこの手順を自動化すれば、大幅に時間を節約できます。
ここで、「リストをクリア」ボタンに到達してタスクを実行するために必要なキーストロークをマップすると、表 Cに示すようなリストが作成されます。
表C |
![]() |
最近使ったドキュメントリストをクリアするためのキー操作 |
この情報を使用して、リスト Aに示すスクリプトを作成できます。
最後のヒント:誤ったキーストロークに関する問題を回避する
マクロでSendKeysメソッドを使用する際によく耳にする最大の不満の一つは、スクリプト実行中にウィンドウのフォーカスが何らかの理由で変更された場合、キーストロークがフォーカスを取得したウィンドウに送られてしまうというものです。この方法の危険性は、あるウィンドウに適用したキーストロークが別のウィンドウに適用された際に、壊滅的な結果(データの損失など)を引き起こす可能性があることです。
これを防ぐには、各SendKeysコマンドラインの前にAppActivateコマンドラインを使用します。これにより、適切なウィンドウがキーストロークを受け取るようになります。この解決策を実装するには、AppActivate、Sleep、SendKeysコマンドを含むサブルーチンを作成し、一連のCallステートメントを使用して、実行するキーストロークとウィンドウのタイトルをサブルーチンに送信します。
たとえば、このサブルーチン手法を、Windows XP の最近使用したドキュメント リストをクリアする前述のスクリプトに適用すると、スクリプトはリスト Bに示すようなものになります。