#はじめに
前回の記事では、スマホゲームを自動化するためのサンプルコードを記載しました。
今回はSikuliXを使用していて発生する問題の解決策を記載していきます。
#発生する問題
SikuliXでは画面上の画像を認識してスクリプトにより操作を自動化します。
しかし、指定した画像サイズが画面上に表示されている画像サイズと違う場合、うまく画像認識されずスクリプトが正しく動作しない場合があります。
例えば、BlueStacksなどのエミュレータではウィンドウサイズを自由に変えることが可能です。
ウィンドウサイズ変更してしまい元のサイズに戻せなくなり、検索画像の取り直ししなければならない状況が発生することがあります。
この事象を解決するため、対象のウィンドウサイズを固定にする方法を検討しました。
#サンプルコード
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import ctypes
# ウィンドウハンドラ取得
hWnd = ctypes.windll.user32.FindWindowW(0, "BlueStacks")
# 移動&リサイズ
ctypes.windll.user32.MoveWindow(hWnd, 1200, 0, 700, 1100, 1)
#解説
サンプルコードは今回もBlueStacksを使用した例です。
FindWindowWでウインドウ名「BlueStacks」のハンドラを取得し、そのハンドラに対してMoveWindowで(1200,0)の位置で700x1100のサイズに移動とリサイズをしています。
しかし、SikuliX2.0.4に組み込まれているPythonではWin32関連のモジュールは組み込まれていないようで、そのまま自動化のスクリプトに組み込んで実行するだけではエラーが発生します。
SikuliX上ではWin32関連モジュールは動作しない仕様のようなので、SikuliX上では動作させずウインドウサイズの変更はWindowsのコマンドラインから実行します。
SikuliXは、そのスクリプトを実行させることで実現します。
上記スクリプトを「C:\sikuli\setwindow.py」に保存したとします。
SikuliX上の別スクリプトから以下の記述で呼び出すことでsetwindow.pyが実行されます。
#ウィンドウサイズ固定
import subprocess
subprocess.call('python C:\sikuli\setwindow.py')
#以降は自動化スクリプトを記載
上記記述を自動化スクリプトの先頭に追加することで、ウィンドウサイズや位置を変更した場合でも、元の位置に戻すことが可能となります。
#まとめ
SikuliX外のPythonスクリプトをSikuliXから実行させることでWin32関連のウインドウサイズ変更を動作させるようにしました。
SikuliXを実行するとき、毎回固定したウインドウサイズにすることで画面サイズが変わることによる認識されない問題を回避できます。
自分の動作環境に応じて表示させる位置や画面サイズの数字を変更し使用してみてください。