2011/03/06

非アクティブのウィンドウにキー操作を送信

GUIプログラムの自動操作を行うとき、対象のウィンドウをいちいちアクティブにしていたのでは、他の作業の邪魔になってしまいます。
ウィンドウを非アクティブのままで操作したければ、キー操作時に送られるウィンドウメッセージを送信する「sendKeys()」を使うといいでしょう。(最近追加された機能なので、使用するには最新版にアップデートして下さい)

下記の例は、ある音楽プレイヤーソフトにPauseのショートカットキーを送信する例です。
require('Window').Window.find('{DA7CD0DE-1602-45e6-89A1-C2CA151E008E}').sendKeys('[x]');
「require('Window').Window.find('...')」で、指定のクラス名を持つウィンドウの内、一番手前のものを表すWindowオブジェクトが返されます。
そのsendKeys()メソッドを呼び出すことで、ウィンドウメッセージによる擬似的なキーストロークの送信を行います。
大抵のソフトでは、タスクトレイに格納されたりして非表示になっていても、ウィンドウ自体は非表示の状態で存在しているため、上記の要領で操作可能です。

ショートカットキーは、親ウィンドウではなく配下のコントロールに送信しなければ動作しない場合があります。
配下のコントロールを表すオブジェクトを取得するには、「control()」メソッドを使用します。
次の例は、「TVXEForm」というクラス名の一番手前のウィンドウの配下の「TEditorX」というクラス名のコントロールに「Ctrlキーを押しながらsキーを押して放しCtrlキーを放す」というキーストロークを送信するというものです。
require('Window').Window.find('TVXEForm').control('TEditorX').sendKeys('Ctrl+[s]');
controlの第2引数に数値を指定すれば、複数の同クラス名コントロールの内、任意のオフセットのものを取得できます。未指定時は0を指定したものとみなされ、最初の物が取得されます。

sendKeysで指定するキーストロークの定義には、NILScriptの「Hotstrokes」ユニットで使用されているストローク定義文字列の内、通常のキーボードのキーのみで構成された物が指定できます。
Hotstrokesでは様々なキーストロークを定義するためのルールがありますが、標準的なショートカットキーを送信するだけなら、修飾キー名(Shift/Ctrl/Alt)に「+」を付けたものに続いてキー名を「[]」で囲んで記述するという方式を覚えておけば十分でしょう。

なお、送信されるキーストロークの内、修飾キーの部分だけはウィンドウメッセージではなくシステム全体に影響する方式で擬似的なキーストローク生成が行われます。
これは、多くのソフトのショートカットキー認識では、修飾キーの状態をシステムに問い合わせて取得しており、ウィンドウメッセージでCtrlの押し下げを送信しても無視されてしまうためです。
このため、修飾キーを伴うショートカットキーを送信すると、他のソフトに意図しない操作が認識されてしまう可能性があります。
できれば実行したい動作を「F1」のような修飾キーを伴わないショートカットキーに割り当てておき、それを送信すると良いでしょう。

0 件のコメント:

コメントを投稿