ファルコムのドラゴンスレイヤーIVの、Windows上で動くエミュレーター版のパスワードを入力する支援ツールの改良版を改造した。
DS4のウィンドウを見つける為にJNI経由でWin32APIを呼び出していて、戻ってこないから別プロセスで実行するようにしていたのだけれど、全てのWin32APIが駄目という訳ではなくて、ウィンドウの列挙(EnumWindows)は上手くいっていて、取得した各ウィンドウのウィンドウタイトルを取得(GetWindowText)しようとする際に、取得できるウィンドウと出来ないウィンドウがあるという事に気付いた。
DS4のウィンドウはちゃんと取得できるけど、何かのウィンドウではGetWindowTextが戻ってこないので、全体として駄目という状態になっていたというわけ。
そこで、Scalaのfutureを使ってGetWindowTextを全部別スレッドで行い、一定時間以内に返ってきたものだけ判定に使うようにしたら上手く動いた。(DS4のウィンドウはちゃんと操作できるので、一定時間内に戻ってくる)
※コメント投稿者のブログIDはブログ作成者のみに通知されます