2013/03/05

【Perl】 Cygwin PerlでGUIハックをやってみますよ!(`・ω・´)

ソフトウェアのGUIは、直感的な操作などに非常に効果的です。
その反面、決まった処理を自動的に実行するなどの作業効率化をしにくい場合があります。

そこで先人たちの仰せに従い、PerlでGUIをハックしたいと思います。 // Perl全くの初心者ですが(;´∀`)
Strawberry Perlを使えば、あっという間に素敵なPerl環境が手に入ります。
しかし、どうしてもCygwinのminttyコンソールとemacsの組み合わせで開発したかったのです・・・。

という訳で、敢えてのCygwin Perlです!(`・ω・´)b

準備
$ apt-cyg install perl
まずはPerl本体をインストールします。既に入っている場合もあると思いますが、念のためw

$ apt-cyg install gcc4
$ apt-cyg install libmpfr4
$ apt-cyg install make
GUIをハックするために、Perlのモジュールである『Win32::GuiTest』をcpanからインストールするのですが、
Cygwin Perlで使うためにはg++が必要など、いくつか必要なものがあるので合わせてインストールします。
モジュールインストール
cpan -i Win32::GuiTest
cpanから、『Win32::GuiTest』をインストールします。環境によっては少し時間かかります。
レッツ自動入力
今回、『メモ帳を起動して、そこに「Hello World!」と自動入力』するスクリプトを書いてみました。

use strict;
use warnings;
use utf8;

# メモ帳を起動
system ("cygstart notepad");
まずはメモ帳を起動するところまで。

Strawberry Perlなど、コンソールにWindowsのコマンドプロンプトを使うPerl環境では『system("start notepad");』で外部起動できますが、
Cygwinでのstartコマンドは『cygstart』を使います!(`・ω・´) // 最初気づかなくて困ったw

use strict;
use warnings;
use utf8;
use Win32::GuiTest qw(:ALL);
use Encode;

# メモ帳を起動して1秒待機
system "cygstart notepad";
sleep (1);
my $sjis = encode('sjis', 'メモ帳$');

# ウィンドウタイトルがメモ帳で終わるプロセスを探す
my @windows = FindWindowLike(undef, $sjis);
for (@windows) {
    SetForegroundWindow($_);
    SendKeys("Hello World!\n");
}
さらに起動したメモ帳をFindWindowLike APIで探してフォーカスを移し、SendKeysで文字入力します。

FindWindowLike APIの第二引数は「ウィンドウタイトル」なので、
後方一致の$をつけて「メモ帳$」で検索すれば良いのですが、Cygwin Perl環境ではShift-JISに変換しないと正常に検索できません

自分は初心者過ぎて、この文字コードの問題に1~2日悩み続けてしまいました・・・orz

上記のスクリプトを「note.pl」ファイルに保存して、「perl note.pl」で実行すればメモ帳が起動して自動入力が行われますw

ビバ!GUIハック!ヽ(=´▽`=)ノ

※2013/05/11: ソースコードのコメントに一部間違いがあったのを修正しました(;´∀`)

0 件のコメント: