2008-10-26[n年前へ]
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コードの方に修正を入れてあります)。
2009-10-14[n年前へ]
■AutoHotkeyで任意の場所・タイミングでRubyやPerl等を使おう
キー入力する際に、さまさまな機能を使いたくなります。たとえば、以前作ったAmetMulti,AmetPerlなどは、ATOKのAMET機能(変換機能を拡張することができる仕様)を使って、Atokでプログラミング言語の一行プログラムを実行させたり、そういったワンライナー(一行プログラム)を辞書登録してしまうことで、文字処理・作成だけでなく、アスキーアート作成機能・画像取得機能などさまざまなことをしてみました。下の動画は、AmetMutiを使って、画像取得を行い、画像処理をかけたり、アスキーアート化を行った時のデモ動画です。
最近のATOKには、そういった機能拡張がより簡易にできる機能が追加されているようです。とはいえ、市販ソフトのお仕着せ機能を使うのも(趣味としては)少しつまらないですし、何より、ATOKで似たようなことをするならAMET拡張機能を使えば良いので、わざわざ車輪の再発明のようなことはしたくありません。(趣味なんですから)何か新しいものに挑戦したいものです。
そこで、今回はWindows用の(これまた無料の)AutoHotKeyを使って、キー入力を自由自在にフックして、さまざまな機能拡張を追加してみたい、と思います。AutoHotKeyはさまざまな機能を持ったソフトウェアなので、AutoHotkeyは、キー・スワッピングや語句置換や、キー入力などをトリガーにした各種処理ができるソフトで、非常に高機能なものです。その概略については、「AutoHotkeyを流行らせるページ」を一読してみれば、知ることができると思います。とはいえ、あまりも機能が多岐にわたっているので、まずは、既存のスクリプトを使ったり・改造したりすることから始めるのが良いと思います。
さて、今日は、AutoHotKeyを使い、"rby"と打つと、クリップボードに入っているRuby(ワンライナー)スクリプトを実行させ、その結果をキー送出させるプログラムを書いてみることにします。
準備作業は、まずAutoHotKeyをインストールします(再起動などは必要ありません)。そして、プロセスを起動して標準出力を読み書きするスクリプトをAutoHotKeyのAutoHotkey.ahkに追加します。もちろん、Rubyも必要です(どのようなバージョンでも構いません)。また、Rubyでなく、Perlでも何でもスクリプトを変えれば同機能を実現できます。
それでは、スクリプトをAutoHotkey.ahkに追加しましょう。
::rby:: a=ruby -e ' c=' d=%a%%clipboard%%c% pi:=PRun(d) PWaitExit(pi) r:=PRead(pi) Send,%r% PClosehandle(pi) returnはい、これだけです。rbyという単語入力がされたら、rubyを-eオプションを付け起動させ、クリップボードの中身をワンライナーとして処理した上で、その結果をキー送出させる、というわけです。
あとはAutoHotKeyで.ahkファイルを再読み込みし、メモ帳を開いて、
puts Time.now.monthと書き、その一行をコピーして、rbyと入力しエンターキーを押すと、そこには10という文字が出現します。もしも、 puts Math.sin(5) という一文をコピーして、rbyと打てば、メモ帳上に-0.958924274663138という文字が出現します。
もちろん、メモ帳でなくても構いませんし、
a=ruby -e 'の一行を
a=perl -e 'とでも適当に替えるだけで、Perlを好きなソフト上で好きなタイミングで自由に使うことができるようになります。awkでも何でも同じ話、です。
というわけで、今日はautoHotKeyを使って、自分の指先が叩くキーボードのすぐ向こうに、RubyやPerlの機能をいつでも呼び出せるようにしてみました。もちろん、この話はさらに(無料の)Mathematica Player機能の実装などにも繋がっていくことになります。