hirax.net::Keywords::「Win32GuiTest」のブログ



2009-09-11[n年前へ]

Ruby Win32GuiTest のアップデートをしました 

 Ruby版 Win32GuiTest クラス、つまり、WindowsのGUI操作など(その他にもMicrosoft Officeを利用したOCR機能なども実装していたりしますが…)をRubyで行うことができるWin32GuiTest (win32GuiTest.rb)の修正作業を少しました。

 修正内容は、コールバック関数を使う部分において「きちんと後片付けする(DL.remove_callbackを呼ぶ)ようにした」という点です。FindWindow▽○×といった辺りの関数を直した、ということになります。修正前のものを使うと、indWindow▽○×をし続けた場合、DL.callの回数上限に引っ掛かりエラーが発生しましたが、その不具合が今回の修正でなくなります。

2010-01-18[n年前へ]

アプリケーション間を繋ぐRubyスクリプトを作るには? 

 Windows上で動くアプリケーション間を繋ぎたい、と思うことがあります。そんな例のひとつが、たとえば、こんなものになります。
 それは、ハードウェアに繋がれたログファイルを定期的に吐き出すアプリケーションがあり、そのハードウェアの状況に応じて、他の制御アプリケーションを通じて他のハードウェアを制御したい、というような場合です。

 そんな時、Rubyでこんな具合のスクリプトを組み、対応してしまうことがあります。hoge.txtは、「ハードウェアに繋がれたログファイルを定期的に吐き出すアプリケーション」が刻々出力を行っている「ログファイル」です。

require 'win32GuiTest'

open("hoge.txt", "r") do |f|
  data=f.readlines[f.readlines.length-1]
  message=$1 if /^hoge:(.+)$/=~data
  @gui.sendKeys(message+'{ENTER}',1)    
end
 つまり、ログファイルの最後の行を読み込み、その出力結果を用いた何かの処理を行い、SendKeys(Win32guitest)で他の(異なる・あるいは同じハードウェアを制御するための)アプリケーションを操作する、という具合です。ここでは、単純のために、捜査対象ウィンドウを最前面に持ってきたり・フォーカスさせる、といった部分は端折っていますが、こんな「その場対応スクリプト」を書いてしまうことがあります。そんな風に対応せざるを得なかったりすることもあります。

 ログファイルを出力できないアプリケーション1と、それと全く無関係の、他のアプリケーション2を繋ぐ場合には、どうすれば良いのでしょう。アプリケーション1のウィンドウを監視する・ウィンドウに対するメッセージをフックする、といったことをすれば良いのでしょうか・・・?

2010-01-22[n年前へ]

Tera TermをRuby(や他の言語から)強引に操作する方法 

 「Tera Termマクロ活用入門(2):リモートマシンを自在に操作する」を読んだ。ちょうど、Tera Term のマクロ機能の使い方や、どのように使われているかを知りたかったところだったので、とても参考になった。

 「Tera Term」はWindows 向けのターミナルエミュレータとして有名だが、マクロ機能を利用することでネットワーク経由でサーバーやネットワーク機器を自動制御するためのツールとしても利用できる。今回は、ネットワーク経由でLinuxサーバーを制御したり、Windowsのバッチファイルと連携させて使用する例を紹介しよう。
 

 Tera Termの自動制御というと、「アプリケーション間を繋ぐRubyスクリプトを作るには?」で行ったテクニックを使っても、Tera Termを自動制御することができる。多量のテキストデータを高速にやりとりするような用途には使うことができないが、そうでない場合には、「アプリケーション間を繋ぐRubyスクリプトを作るには?」で書いた方法でRuby(や他の言語からも同様に)Tera Termを操作することができる。

 Tera Termから、ログファイルを吐き出すようにしておいて(Fileメニュー→Logメニュー)、その内容を随時外部スクリプトから読み込んで、Tera Termを操作してやれば良い、という手順である。そうすれば、Tera Termの送受信内容に応じた動作をRuby(や他の言語)を使って行わせることができる。つまり、Tera termのマクロを自分が使い慣れているスクリプト言語などを使って書くことができる、というわけである。

 「Tera Termのマクロではできそうにないこと」がある時には、そんな強引な外部言語を使った、強引マイウェイなTera Term操作(マクロ)テクニックもある。

2011-07-10[n年前へ]

Ruby版Win32GuiTestをアップデートしました 

 Ruby版のWin32GuiTestをアップデートしました。アップデートした点は、キーボードの状態検知・入力検知のための関数 getKeyState, getAsyncKeyState, getKeyboardState といった辺りを追加したことと、Microsoft Office 自動操作のための変数定義などを追加したこと、になります。ダウンロードはこちら(win32guitest.latest.zip)になります。

 「キーボードの状態検知」という言葉を聴くと、首をかしげてしまう人も多いことでしょう。なぜなら、「GUI操作を自動化する」という本来の目的を考えてみれば、「手動」で動かされるキーボードの状態検知をする関数は、まさに必要ないはずのものだからです。

 つまりこれは、Win32GuiTestというより、Win32APIを使うためのゴッタ煮ソースです。Win32API関数や、Microsoft Office操作に用いられる定数定義などを詰め込んだRubyソースです。

 今回は、PowerPointでアクションゲームを作ってみる(コントローラはRuby編)で必要だったリアルタイム・キーボード入力検知に必要な関数群やPowerPointの各種操作に必要な定数定義などを放り込んでみました。これは、たとえば、下記のようにキー検知を行う関数です。

up=gui.getAsyncKeyState VK_UP
if up==1 # push(default=>0)
 # do something
end



■Powered by yagm.net