創作內容

1 GP

使用Autoit在BlueStacks上玩Tap Titans(2/?)

作者:ej│2017-04-08 19:40:39│巴幣:2│人氣:1283

第一部分 前言

經過上一則的介紹
我們應該可以把BlueStacks開在螢幕的左上角
然後開啟我們寫好的script
連續點擊(200,200)的位置一段時間
不曉得大家試過了沒有?

第二部分 動機

那麼使用起來有沒有覺得哪邊不方便呢?
我先說我的觀點:有!
因為在連點的過程中
滑鼠的操控都被程式搶走了
如果我想要做別的事情怎麼辦?
一定要等程式結束嗎?
我不斷的移動滑鼠
結果程式不斷的把滑鼠移回程式要點的地方
真是太恐怖了!!

接下來我要想辦法
如何讓他自己點擊遊戲
卻又不會影響我使用電腦的其他功能

第三部分 實作

這部分比較跳躍
如果有什麼問題就再說了

依據觀察
上一個做法是點擊螢幕上的某一個位置
那麼這一次
我希望是針對某一個程式做點擊就好

第三之一 滑鼠控制

一般來說常用來處理滑鼠控制的方式
有以下兩種
  window message
  direct input
而以BlueStacks的樣子來看
前者的可能性較大
我後來嘗試的結果也是如此
如果BlueStacks用的是Direct Input
那就非常棘手了

第三之二 滑鼠事件

window message顧名思義是傳給某一個視窗的訊息
Windows Api裡面可以使用SendMessage或是PostMessage
https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms644950(v=vs.85).aspx
一共四個參數
第一個是要傳過去的視窗編號(我也不知道怎麼稱呼window handle比較好)
第二個是事件的編號
第三、四個是事件的參數

讓我一一來說明
如何組成一個滑鼠點擊事件
視窗編號:
這部分會在三之三詳細介紹
事件編號:
這邊我們會用到的是WM_LBUTTONDOWN與WM_LBUTTONUP
一個滑鼠點擊會是由滑鼠左鍵按下之後
再接一個滑鼠左鍵放開所組成
如果有興趣可以看一下完成的介紹
https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms644927(v=vs.85).aspx#system_defined
事件的參數:
對應到WM_LBUTTONDOWN與WM_LBUTTONUP
可以參考msdn的說法
https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms645607(v=vs.85).aspx
wParam的部分
在WM_LBUTTONDOWN的時候要填MK_LBUTTON
在WM_LBUTTONUP的時候似乎填0就可以了
lParam的部分
在WM_LBUTTONDOWN與WM_LBUTTONUP的時候都一樣
比較低的兩個byte是x
比較高的兩個byte是y
換句話說
你想要表示(100,200)這個位置
你要把它轉換成100+200*2^16

第三之三 取得視窗編號

請愛用spy++(或者是spyxx)
(我的spyxx似乎是安裝visual studio的時候附的)
按下"Find Window"
從跳出來的視窗上拖曳"準心"的icon到你要觀察的視窗上
按下OK看它的Property
你可以看到一個window caption為_ctl.Window
class name為BlueStacksApp的視窗
而它的window handle則是我們要的編號

第三之四 呼叫WinApi

既然知道了所有的參數
現在就要透過Autoit去呼叫SendMessage
按下左鍵
DllCall("user32.dll", "int", "SendMessage", "hwnd", $Window, "int", 0x0201, "int", 0x0001, "long", _MakeLong(200, 200))
放開左鍵
DllCall("user32.dll", "int", "SendMessage", "hwnd", $Window, "int", 0x0202, "int", 0x0000, "long", _MakeLong(200, 200))

其中$Window是你找到的視窗編號
_MakeLong則是把座標轉的涵式
會在三之五寫出來

第三之五 修改之後

使用SendMessage之後就長成這樣
Local $Window = 0x006F09FA

For $i = 1 to 100
    DllCall("user32.dll", "int", "SendMessage", "hwnd", $Window, "int", 0x0201, "int", 0x0001, "long", _MakeLong(200, 200))
    DllCall("user32.dll", "int", "SendMessage", "hwnd", $Window, "int", 0x0202, "int", 0x0000, "long", _MakeLong(200, 200))
Sleep(10)
Next

Func _MakeLong($LoWord,$HiWord)
    Return BitOR($HiWord * 0x10000, BitAND($LoWord, 0xFFFF))
EndFunc
事不宜遲執行看看結果如何
.
..
...
不會動!!

第三之六 對不起!找錯人了

馬上打開spyxx來看BlueStacks的事件
右鍵點擊該視窗選擇"Messages"
然後點"Logging Options"
進入"Messages"的tab勾選mouse
這樣一來它就會顯示所有mouse相關的window message
試著正常的操作遊戲之後發現
並沒有事件跑出來
再去看它的property會發現
它的window styles有WS_DISABLED
https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms632600(v=vs.85).aspx
它的意思是"A disabled window cannot receive input from the user."
對不起!找錯人了
要找的是它上一層的視窗編號
回到spyxx
找它到它上一層的視窗
把它的window handle寫到程式裡
這一次總算按到了!
不過這兩個視窗的位置不一樣
你想要按到遊戲的(200,200)
跟它上一層視窗的(200,200)不一樣
還好這個稍微喬一下就OK了
就算位置不準其實也還可以接受

第四部分 結果與觀察

這一次相當不錯
可以一直點擊遊戲
但又不會影響我看網頁
另外
遊戲的點擊明顯比MouseClick快多了
你可以發現主角一秒點擊的數量是有限的
當sleep的時間接近50ms的時候
彈跳出來的攻擊數字才會是不間段的
可以推測一秒上限是20次點擊
但是另一個有趣的事情發生了
寵物的攻擊不在這個限制
寵物要20次點擊才會發動一次攻擊
但明顯得可以看出來
寵物一秒不只攻擊一次
看來要把寵物的攻擊極大化
非得用程式不可

到目前為止
似乎是方便許多了
也希望大家能玩得愉快 ;-)
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=3537855
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:autoit|bluestacks|tap titans

留言共 1 篇留言

君羊
真是受益良多,原本還以為是BlueStacks內部的API呢
差點就要找錯方向了

11-24 14:57

我要留言提醒:您尚未登入,請先登入再留言

1喜歡★ejwing 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:使用Autoit在Blu...

追蹤私訊切換新版閱覽

作品資料夾

SALOL~~
望德勒斯圖書館更新中~看更多我要大聲說昨天15:03


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】