2004-12-02[n年前へ]
■WindowsのCUI版zphoto
WindowsのCUI版zphotoが欲しい、という話題。以前は、Windows版もCUIのみだったが、今ではGUI版のみのバイナリが配布されている。そこで、マウスを使いたくない時、だけどコンパイル作業がメンドクサイ時に作ったスクリプトがこれ。あぁ、なんて強引。「マウスは使ってない(あくまで私は)」という強引さ。
use Win32::GuiTest qw( FindWindowLike GetWindowText SetForegroundWindow MouseMoveAbsPix SendMouse GetWindowRect SendKeys);
my $pid = fork;
die unless defined $pid;
if($pid) { sleep 1;
@windows = FindWindowLike(0, "フォトアルバムを作成");
foreach my $win (@windows) { SetForegroundWindow($win);
SendKeys("{ENTER} {TAB}{ENTER}{ENTER}");
} for(my $i = 0;
$i < 61;
$i++){ @windows = FindWindowLike(0, "フォトアルバムが作成されました");
if(@windows > 0){ last;
} else{ sleep 1;
} if($i == 60){ &error("Time Out!");
exit;
} }foreach my $win (@windows){ SetForegroundWindow($win);
SendKeys("{TAB}{ENTER}%{F4}");
} exit;
}system("\"$zphoto\" -o \"$SwfPath\" --photo-width=800 --gamma 1.25 --title \"ppt2zphoto\" $Slides");
exit;
2008-07-31[n年前へ]
■「計測・解析ソフトのハック」が実験系技術者の一番のLifeHack…かもしれない。
「計測・解析ソフトウェア/ハードウェアのハック」が実験系技術者の一番のLifeHack…かもしれない、と思っています。それを逆に言うならば、実験系技術者が費やす多くの時間を、計測・解析ソフトが消費しているということになります。つまり、一番時間を消費している部分の高速化をすることが、全体の高速化に効果的だろう、ということです。
そんなこんなで、何を今更…という、Perlで「シリアル通信とユーザインターフェース自動制御」のやり方を整理しておくことにしました。なぜかというと、経験的に「計測・解析ソフトウェア/ハードウェアのハック」は、シリアル通信制御とユーザインターフェース自動制御でほとんどの場合対応できることが多いから、です。しかも、計測・解析ソフトウェア/ハードウェアを外注したりすると、時間や費用が無視できないほどかかったりするわけで、そういったシステムを簡単に作ることができるということを知っていると、結構便利であるわけです。
たとえば、RBIOシリーズのような汎用(入)出力ボードは、お小遣い程度の価格で「シリアル通信経由でのハードウェア制御をする」ことが簡単にできます。それは、「計測ハードウェアのハック」がとても簡単にできる、ということです。
そして、Windows上(あるいはWindows上で動くソフトウェア)の作業を”勝手に”プログラミングすることができれば、「計測・解析ソフトウェアのハック」も簡単にすることができます。
というわけで、「シリアル通信とユーザインターフェース自動制御」ができれば、「計測・解析ソフトウェア/ハードウェアのハック」を簡単に実現することができるわけです。
とりあえず、たとえば、Perlで「シリアル通信とユーザインターフェース自動制御」を使うには、Win32::SerialPort と Win32::GuiTest という二つのライブラリが必要です。それらのインストールは、コマンドプロンプトから、
ppm install Win32-SerialPortという風に行うことができます。もっとも、インターネットに直接アクセスすることができない Proxy 内部からであれば、
ppm install http://www.bribes.org/perl/ppm/Win32-GuiTest.ppd
set HTTP_proxy=http://proxy.hoge.com:8080といったような、Proxy対策の環境変数設定をコマンドプロンプトから前もって行っておくことが必要になります。
set HTTP_proxy_user=hogehoge
set HTTP_proxy_pass=hogehoge
あとは、シリアルポート通信ようのConfigファイルを作る、プログラムを書く、ということだけです。たとえば、
!c:\perl\bin\perlといったライブラリを読み込む宣言をした後に、ソフトウェアのユーザインターフェース周りは、
use Win32::SerialPort;
use Win32::GuiTest qw( FindWindowLike GetWindowText SetForegroundWindow MouseMoveAbsPix SendMouse GetWindowRect SendKeys);
MouseMoveAbsPix(320, 160);というような感じで、マウスやボタンやキーボードを自動で動かすことができます。また、ハードウェア周りは、
SendMouse("{LEFTCLICK}");
SendKeys($fileName);
SendKeys("{ENTER}");
my $conf_file="serialport.conf";という感じで*、スイッチやモータを適当にシリアル通信(とRB-IOのようなお手軽I/Fボードで)制御すれば良い、という具合です。午前中に秋葉原に行って部品を買って、午後にスクリプトを2,30行書けば、それで自動計測・制御システムのできあがり、というわけです。
tie *PORT, 'Win32::SerialPort',$conf_file or die; pushSwitch(0);
close PORT or warn "Can't close serialport:COM*";
sub pushSwitch{
my ($portNo) = @_;
my $text=sprintf "PCT%d%d\n",$portNo,1;
print PORT $text;
}
*(なお、ここで使用している"serialport_conf"は、こういったserialport_conf.plで作成します)
2008-11-15[n年前へ]
■Ruby版 Win32GuiTest クラスを作りました。
(この記事の続きが「続:Ruby版 Win32GuiTest クラスを作りました。」)になります。
Ruby版 Win32GuiTest クラスを作りました。PerlのPerlのWin32-GuiTestと同じような機能を集めたものです。つまり、MoonWolf さんのWin32::GuiTestと同じようなものです。
夕方からPerlのWin32::GuiTestの関数リストを見て、それと同じようなものををつらつら書いていき、私自身が使いそうにない関数・機能が続き始めた辺りでやる気が下がってきたので、とりあえずソースコード(guiTest.rb)をここに置いておくことにします。
(コードにも入っていますが)サンプルコードは下記のようになります。これは、「ワードパッドを立ち上げて、ウィンドーを全面に持ってきて、適当に文字を入力して、その文字をコピーして数回ペーストした後に、保存せずに終了する」という具合に動きます('RichEdit20W'の部分は、クラス名からの子ウィンドゥ検索を示すために入れたので、実際にはなくても構わない部分だと思います)。
gui=Win32GuiTest.new gui.run('wordpad.exe') sleep 2 gui.setForegroundWindow( gui.findWindowLikeName('ワードパッド').first[0] ) gui.setFocus( gui.findWindowLikeClass('RichEdit20W').first[0] ) gui.sendKeys('This is a sample.{ENTER}',1) gui.sendKeys('^a^c') 5.times do |i| gui.sendKeys("#{i} ...{ENTER}") gui.sendKeys('^v') end gui.sendKeys('%f',2) gui.sendKeys('x',1) gui.sendKeys('n',1)VMware上で作業をしていることもあり、動作未確認の部分(マウス操作・ホイール操作)もあるのですが、「キーボード・マウス・ウィンドウを操作する」というGUIの基本三点セット処理にはそこそこ使える・・・と良いな、と思っています。
2008-11-16[n年前へ]
■続:Ruby版 Win32GuiTest クラスを作りました。
(この記事は「Ruby版 Win32GuiTest クラスを作りました。」)の続きです。
Ruby版 Win32GuiTest に関数・機能を追加しました。下の動画は「ペイントを立ち上げて、ウィンドウの場所を動かし、絵を描いた上で、ビットマップファイルを保存する」という作業をRuby版 Win32GuiTestを使ってRubyで自動で行ったものになります。
実際のコードはソースコード(guiTest.rb)に入っているように、下記のようになります。次はリサージュ図形でも書いてみることにしましょうか。
gui=Win32GuiTest.new gui.run('mspaint.exe') sleep 1 w=gui.findWindowLikeName('ペイント').first[0] gui.setForegroundWindow(w) gui.moveWindow(w) r=gui.getWindowRect(gui.getForegroundWindow) sleep 1 360.times do |i| rad=i*2*3.14/360.0 x=r[0]+200+100*Math.cos(rad) y=r[1]+200+100*Math.sin(rad) gui.mouseMoveAbsPix(x.to_i,y.to_i) gui.sendLButtonDown if i==0 end gui.sendLButtonUp gui.sendKeys('%f',2) gui.sendKeys('x',1) gui.sendKeys('y',1) gui.sendKeys('TestBitmap.bmp',2) gui.sendKeys('{ENTER}',2)
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スクリプトを修正したりする作業が実に簡単になります。
単純作業をスクリプトで書く場合には、ソースコードをゼロから書き始めるよりは、叩き台・スケルトンからスタートする方が「とっつきやすい」ものです。もちろん、「とっつきやすい」コースが最終的に楽なコースかどうかは場合によりけりだと思いますが、いじり始める叩き台が自動的に作ってくれるツールというのは、とても便利なものだと思います。