UWSCでマクロを作ってみよう

##はじめに
この記事は [SLP KBIT Advent Calendar2014](http://www.adventar.org/calendars/417) の17日目です。

##マクロって何？
マクロは、操作手順をプログラムとして記述し自動化することを言います。
Excelのことを調べたことがある人は、Excelの検索ワードで「Excel マクロ」というのを1度は見かけたことがあるのではないでしょうか？
Excelのマクロを覚えると、Excelのデータを元にグラフを自動作成したりできます。カッコイイですね。
Excelのマクロを作る場合は、「シートを閉じる」、「ブックを開く」など、Excelの用語を知っていないと理解しずらい部分があるかもしれませんが、今回この記事で紹介するものは、私たちが普段行っている「クリック」、「マウスポインタの移動」を自動化するものです。
少しプログラムを勉強していれば、簡単に作ることができるので遊んでみてください。

##UWSCをダウンロードしよう

UWSCは、Windowsの作業を自動化するツールです。
こちらのページの「ダウンロード」から、Free版をダウンロードしてください。

http://www.uwsc.info/

解凍すると、フォルダの中に「UWSC.exe」という実行ファイルがあるので、起動してください。
起動するとこのような画面が出てきます。

![uwsc.png](https://qiita-image-store.s3.amazonaws.com/0/61622/d2743eaa-dee0-3eae-72a0-80340618844d.png)


##付属のサンプルを動かしてみよう

解凍したUWSCのフォルダの中には、「サンプル.UWS」というファイルがあるので実行してみましょう。
UWSCの画面にある5つのボタンのうち左端のボタンは、実行するUWSCのコードを開くボタンです。
押すとファイルを開くウィンドウが出るので、「サンプル.UWS」を選択し、「開く」を押してください。
サンプルを開くと、真ん中の実行ボタンが選択できるようになるので、実行してください。
起動すると、しばらくマウスが使用できなくなりますが驚かないでください。
このようにUWSCではアプリの起動や、マウス操作を自動化することができます。

##UWSCのコードを書いてみよう

簡単なUWSCのコードを紹介します。作成するプログラム用に1つフォルダを作成し、その中に置いておきましょう。
まずはこのコードを実行してみましょう。拡張子は .UWS です。ファイル名は日本語ですが、UWSCではGUIで開くので、特に困ることはありませんでした。

```UWSC:解像度表示.UWS
X = G_SCREEN_W               // 解像度の幅取得
Y = G_SCREEN_H               // 解像度の高さ取得
PRINT "あなたのデスクトップの解像度はこのようになっています<#CR>"    // ウィンドウに出力
PRINT "  幅 : " + X
PRINT "高さ : " + Y
```

起動すると、このようなウィンドウが表示されます。

![解像度.png](https://qiita-image-store.s3.amazonaws.com/0/61622/9ad7fe55-9882-e4d2-754b-9466c83abe5f.png)

UWSCでは、c言語のようにmain関数を宣言する必要はありません。
個人的には、UWSCの構文はRubyに近いと思います。

G_SCREEN_Wは、実行環境等に関する情報が格納された特殊変数です。
この中には解像度の画面幅が格納されています。
PRINT関数は出力関数です。出力先は、実行すると現れるウィンドウになります。<#CR>は、c言語でいう \n で、改行を表します。

##マウスポインタをランダムに移動するコードを作成しよう

マウスポインタを動かすコードを紹介します。
このコードを実行してください。


```UWSC:マウスポインタ移動.UWS
FOR A = 1 TO 10                  // 10回ループ
  X = RANDOM(G_SCREEN_W)         // 画面内に収まるランダムな値を生成
  Y = RANDOM(G_SCREEN_H)
  MMV(X, Y)　　                  // マウスの移動
  SLEEP(1)                       // プログラムを1秒停止
NEXT
```

実行すると、1秒ごとにマウスポインタが移動します。

FOR文では、Aのなかに1から10の値が入っています。c言語の for(a=1;a<=10;a++) と同じ働きをします。
RANDOM関数は、0から引数以下の値をランダムで作成します。画面内に収めるため、先ほど紹介した特殊変数を使用しています。
MMV関数は引数で座標を指定し、マウスポインタの移動をします。Xが幅、Yが高さになります。この1文を BTN(LEFT,CLICK,X,Y) にすると、クリックになります。デスクトップ上の座標が知りたい場合、「おーとくりっか～」というソフトがおすすめです。
SLEEP関数は、引数秒だけプログラムを停止します。

##無限ループの止め方

先ほどのプログラムを無限ループにします。

```UWSC:マウスポインタ移動.UWS
WHILE TRUE                       // 無限ループ
  X = RANDOM(G_SCREEN_W)        
  Y = RANDOM(G_SCREEN_H)
  MMV(X, Y)　　                
  SLEEP(2)                       // プログラムを2秒停止
WEND
```
FOR文をWHILE文に変え、無限ループにしました。
UWSCのプログラムは、「STOP」を押すことで停止できますが、ALT+F2でも停止させることができます。

##画像判定をしてみよう

指定した画像が画面内にあるか判定するコードを紹介します。
プログラムを作成する前に、判定に使用する画像test.bmpを作成しましょう。

今回はペイントを使用します。
プリントスクリーンを使い、ペイントに張り付けてください。
そして、実行するときにじゃまにならないような、デスクトップの端の方を切り取って保存してください。
ただし、保存するときは「ファイルの種類」を24ビット ビットマップにしてください。それ以外では反応しませんでした。
作成した画像ファイルは、プログラムがあるフォルダに入れてください。


```UWSC:画像サーチ.UWS
ifb CHKIMG( "test.bmp")    // 指定した画像があるか
  X=G_IMG_X                // 画像の座標をxへ代入
  Y=G_IMG_Y                // 画像の座標をyへ代入
  PRINT "指定された画像が見つかりました<#CR>"
  PRINT "X座標 : " + X
  PRINT "Y座標 : " + Y
else
  PRINT "画像を探しても見つかりませんでした。"
endif
NEXT
```
ifb関数はif文です。ifと書いてもしても動きますが、UWSCではifbと書くことが多いようです。
CHKIMG関数では、指定した画像があるかを判定します。画像があればTrueが返ってきます。また、その時に特殊変数のG_IMG_XとGIMG_Yに、座標が格納されます。


##おわりに
今回説明したものを使えば、画像を判定して、その画像をクリックするマクロを作成することができます。
なので、最近よく見る広告に出てくるD●Mのゲームくらいなら、自動化するとができると思います。というか、試しに1つ登録して作ってみるとできました。
ただ、艦●これくしょんでそれをして、垢バンされた人がいるとかいないとかを掲示板で見かけました。なので、使用は自己責任でお願いします。

##参考文献
UWSC コバヤシ式 http://canal22.org/