2008-12-01[n年前へ]
■「Windows操作を再現するPerlスクリプト」を自動で作る"Win32GuiTest.exe"
PerlでWindowsのGui操作を記述することができるライブラリ Win32::GuiTest を、ppmからインストールするのではなくてWin32-GuiTest-1.56.tar.gzとしてダウンロードしてみると、"Win32-GuiTest Recorder"というwindows アプリケーションが付属していることに気づきました。
"Win32-GuiTest Recorder"が行う動作を「ひとこと」で言ってしまえば、「マウスイベントとキーボードイベントをフックし、得られたマウス操作やキーボード操作をPerlのソースコードとして保存してくれる」というものです。たとえば、「( "Win32-GuiTest Recorder" の)"Record"ボタンを押し、適当にキーボードとマウス作業をしてから、"Stop"ボタンを押す」と、こういったPerlソースコードが自動作成されます。
#!/usr/bin/perl use Win32::GuiTest qw/:ALL/; $Win32::GuiTest::debug = 0; MouseMoveAbsPix(303, 484); SendMouse('{LEFTCLICK}'); SendKeys('{ENT}test{ENT}'); SendRawKey(VK_LCONTROL, KEYEVENTF_EXTENDEDKEY); SendKeys('s'); SendRawKey(VK_LCONTROL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP); MouseMoveAbsPix(169, 484); SendMouse('{LEFTCLICK}'); SendKeys('{BAC}{ENT}'); SendRawKey(VK_LCONTROL, KEYEVENTF_EXTENDEDKEY); SendKeys('s'); SendRawKey(VK_LCONTROL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP);
ソースを眺めてみれば、結局、Windows操作を、MouseMoveAbsPix と SendMouse と SendKeys と SendRawKey として記録するだけになります。しかし、Windows上の操作を一回するだけで、スクリプトが自動生成されるというのは、とても便利です。しかも、マウスイベントとキーボードイベントだけを記録するだけでなくて、起動時に表示されるダイアログで"Windows Hint"オプションを付けておけば、「操作を行ったWindowの名前やクラス」を(ソースコード内にコメントとして)記録しておいてくれるのです。これは、後からfindWindowなどを使った処理に変える際に非常に便利です。Windowのクラスや名前を自動で記録しておいてもらえると、たとえば、(画面サイズが異なる他の人のPCで動くように)後でPerlスクリプトを修正したりする作業が実に簡単になります。
単純作業をスクリプトで書く場合には、ソースコードをゼロから書き始めるよりは、叩き台・スケルトンからスタートする方が「とっつきやすい」ものです。もちろん、「とっつきやすい」コースが最終的に楽なコースかどうかは場合によりけりだと思いますが、いじり始める叩き台が自動的に作ってくれるツールというのは、とても便利なものだと思います。
2008-12-02[n年前へ]
■"Win32GuiTest.exe"で「Windows操作を再現するRubyスクリプト」を自動で作る
PerlでWindowsのGui操作を記述することができるライブラリ Win32::GuiTest を Ruby に移植した Win32GuiTest クラスをバージョンアップし win32GuiTest.rb として、ここに置きました)。変更点の一つめは、"pushButton" ""pushChildButton" "sendMessage" "postMessage" "getTopWindow" といった関数を増やしたことです。
そして、もう一つが「マウスイベントとキーボードイベントをフックし、得られたマウス操作やキーボード操作を Perlのソースコードとして保存してくれる」"Win32-GuiTest Recorder"(ここに Recorder.lzh としてコピーを置いておきます)が出力したPerlのソースコードをRubyスクリプトに変更する処理を、クラスメソッドとして実装したことです。たとえば、
require 'win32GuiTest' Win32GuiTest.convertPerlScript("pl.pl")といったコードを書けば、"Win32-GuiTest Recorder"が出力したPerlスクリプト"pl.pl"をもとに、Rubyスクリプトが出力されます。(たとえば、pl.plを変換した結果がpl2rb.rbになります)。
これで、PerlユーザだけでなくRubyユーザも(とはいえ、きっとPerlを使うことができる人はRubyも使うことができるだろうし、Rubyを使うことができる人はPerlも使えるだろう・・・と思っているのですが)、"Win32-GuiTest Recorder"を使ったWindows 操作のスクリプト自動生成のありがたみを味わえる、ということになります。
ちなみに、"Win32-GuiTest Recorder"の設定は、ダイアログのチェックボタンを下に示したスクリーンショットのように(とりあえずは)ユーザが処理した待ち時間やウィンドー情報を保持しておくのと、後で便利でお勧めです。
■"Win32GuiTest.exe"で自動作成したRubyスクリプト実行動画
"Win32GuiTest.exe"で「Windows操作を再現するRubyスクリプト」を自動で作るの処理例、つまり、"Win32GuiTest.exe"で自動作成したPerlスクリプトをWin32GuiTest by RubyでRubyスクリプトに変換し、そのRubyスクリプトを走らせてみた時の動作画面を下に動画として貼り付けておきます。
まずは、下に貼り付けた動画がpl2rb.rb(変換前のPerlスクリプトはpl.plになります)の実行画面になります。行った作業はテキストを入力して、何回かコピー&ペーストして、その後に削除する、というものです。
そしてこちらがoutput_revised.rb (変換前のPerlスクリプトはoutput.rbです)の実行画面です。行った作業は、日本語入力とアルファベット入力を自動で行ったものです(ちなみに、"Win32GuiTest.exe"は、私の環境では、日本語変換モード切り替えのキーコンビネーションをきちんと記録してくれなかったので、Rubyコードの方に修正を入れてあります)。