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