マウスの再生マクロ | 帥チョウのマクロ部屋

帥チョウのマクロ部屋

乱世キングというゲームでUWSCというツールを使ったオートマクロの説明です

マウスの座標取得マクロを使うと、shiftキーを押したタイミングのマウス座標をメモ帳に記録する事ができます。
Shiftキーを何回も押すと、そのたびにメモ帳にマウス座標が記録されます。


このログを再生する事をやってみましょう。
(注)このマクロではクリックとクリックとの間の時間までは再生しません。
単に「マウス位置を移動 → クリック → 一定時間待つ → マウスを移動 → クリック → …」という事をやっています。

『マウス再生.uws』
// グローバル変数
Public IEID
Public IEobj

// Read 用のメモ帳を開く
notepadID = GETID("メモ帳",, 0.1)
if notepadID < 0 then
  // "メモ帳" でヒットしない場合は "Notepad" を試してみる
  notepadID = GETID("Notepad",, 0.1)
  if notepadID < 0 then
    // それでもダメなら終了
    fukidasi("メモ帳が見つかりません。",0,0)
    Sleep(1)
    fukidasi("")
    exit
  endif
endif

// IEのハンドルを取得
//IEID = GETID("Windows Internet Explorer")
IEID = GETID("Internet Explorer")

if IEID < 0 then
  FUKIDASI("IE not found.")
  Sleep(1)
  FUKIDASI("")
else
  // IEのオブジェクトを取得
  IEobj = GETACTIVEOLEOBJ("InternetExplorer.Application")
endif

fukidasi("Shiftキーで開始",0,0)
while 1
  inKey = keyboard_enter()
  if inKey = 1 then
    // Shiftキーが押されたら while ループを抜ける
    fukidasi("")
    break
  elseif inKey = 2 then
    // Esc キーが押されたら処理を終了
    fukidasi("キャンセルされました",0,0)
    sleep(1)
    fukidasi("")
    exit
  endif
wend


// main処理の開始
// ここから「マウス再生」処理

// tmpstr にメモ帳の中身を読み込む
tmpstr = getstr(notepadID)
// 改行で分離して、配列 tmpword[] に格納
tmpword = split(tmpstr, "<#CR>")
// 配列 tmpword[]の要素数-1
pointNum = length(tmpword) - 1

for loopCount = 0 to pointNum
  if keyboard_enter() = 2 then
    // Esc キーが押されたら処理を終了
    fukidasi("キャンセルされました",0,0)
    sleep(1)
    fukidasi("")
    exit
  endif
  if tmpword[loopCount] <> "" then
    // tmpword[] を x座標とy座標に分ける
    tmpNum = split(tmpword[loopCount],",")
    if chknum(tmpNum[0]) = true then
      xpos = VAL(tmpNum[0])
      if chknum(tmpNum[1]) = true then
        ypos = VAL(tmpNum[1])
        // (xpos,ypos) の座標が取得できたので
        // その位置にマウスカーソルを移動
        fukidasi("("+xpos+","+ypos+")",xpos+10,ypos+10)
        MMV(xpos,ypos)
        sleep(0.5)
        // その場でクリック
        BTN(LEFT,CLICK)
        BusyWait(1)
        fukidasi("")
      endif
    endif
  endif
next

// main処理の終了


// サブルーチン
//------
Procedure BusyWait(count)
  if IEID < 0 then
    // IEのハンドルが取得できなかった場合は
    // 指定の秒数をスリープ
    Sleep(count)
  else
    Sleep(0.5)
    // busyフラグが落ちるまでリピート
    repeat
      Sleep(0.2)
//    until (! IEobj.busy) and (IEobj.readyState=4)
    until (IEobj.readyState=4)
//    until (! IEobj.busy)
    Sleep(0.5)
  endif
Fend

//------
// Shiftキーで "1"、Escキーで "2" が返る
Function keyboard_enter()
  Result = 0

  sleep(0.2)
  while 1
    if GETKEYSTATE(VK_SHIFT)
      Result = 1
      Exit
    elseif GETKEYSTATE(VK_ESC)
      Result = 2
      Exit
    else
      Result = 0
      Exit
    endif
    sleep(0.2)
  wend
Fend

何をやっているか、ですが、
getstr という関数を使うと、メモ帳の中身を読み込む事ができます。
// tmpstr にメモ帳の中身を読み込む
tmpstr = getstr(notepadID)
さらに split という関数を使うと、読み込んだデータを配列に分割する事ができます。
// 改行で分離して、配列 tmpword[] に格納
tmpword = split(tmpstr, "<#CR>")
上記は、改行コード "<#CR>" で分割しています。
次に、"," (コロン)で分割すれば、x座標とy座標に分割できます。
// tmpword[] を x座標とy座標に分ける
tmpNum = split(tmpword[loopCount],",")
分割しただけでは、データは文字列として保持されていますので、これを数値に変換してやります。
(C言語で言うと、char*型をint型に変換しています)
xpos = VAL(tmpNum[0])
こうして x座標とy座標が得られたら、その場所にマウスカーソルを移動してクリックをしています。

このマクロは、たとえば軍陣のレベル上げの時に使えますね。