9

Javaプログラムの画面イベントに反応したいので、実際の画面で画像を見つけたいと思います。ロボットクラスからスクリーンショットを取得してピクセルを検索するメソッドを作成しようとしましたが、時間がかかりました。

AutoItにはこの仕事をかなりうまく行う外部DLLがあることを知っています、そして今私はそれをJavaで実行しようとしました...しかし私は立ち往生しています:/

.dllはAutoItで呼び出されます。次のように含まれます。

Func _ImageSearch($findImage,$resultPosition,ByRef $x, ByRef $y,$tolerance)
   return _ImageSearchArea($findImage,$resultPosition,0,0,@DesktopWidth,@DesktopHeight,$x,$y,$tolerance)
EndFunc

と:

Func _ImageSearchArea($findImage,$resultPosition,$x1,$y1,$right,$bottom,ByRef $x, ByRef $y, $tolerance)

if $tolerance>0 then $findImage = "*" & $tolerance & " " & $findImage
$result = DllCall("ImageSearchDLL.dll","str","ImageSearch","int",$x1,"int",$y1,"int",$right,"int",$bottom,"str",$findImage)

if $result[0]="0" then return 0

$array = StringSplit($result[0],"|")

$x=Int(Number($array[2]))
$y=Int(Number($array[3]))
if $resultPosition=1 then
  $x=$x + Int(Number($array[4])/2)
  $y=$y + Int(Number($array[5])/2)
endif
return 1
EndFunc

私はdllを取得し、jnaのようなものを試しましたが、動作させることができません。AutoItXを使ってAutoIt関数をJavaで実行しようとしましたが、インクルードでは機能しません。手伝って頂けますか?

編集:わかりました、私はJNAで別の試みをしました、そして今私は文字列を取り戻します-しかし文字列はエラーを意味します。どうしたの?私はインターフェースを持っています:

public interface ImageSearchDLL extends Library{
ImageSearchDLL INSTANCE = (ImageSearchDLL) Native.loadLibrary("ImageSearchDLL", ImageSearchDLL.class);
String ImageSearch(int x1, int y1, int x2, int y2, String findImage);   
}

そして私はそれをこのように呼びます:

static {
    File file = new File("libs", "ImageSearchDLL.dll");
    System.load(file.getAbsolutePath());
    }
(...)
String a = ImageSearchDLL.INSTANCE.ImageSearch(0, 0, 500, 500, "C:\myProg\OK.bmp");

私はいつも「0」を返します。これは、AutoITファイルで確認できるようにエラーまたは見つからないことを意味します。

; If error exit
if $result[0]="0" then return 0

それを修正するのを手伝ってもらえますか?

4

1 に答える 1

1

パスに代わる方法はRuntime.getRuntime().exec()、画像検索を実行するアプリケーション (c、autoit スクリプトなど) を生成し、それらの間の通信にファイル ベース/ポーリング方法 (または標準出力を介して) を使用して結果を取得するために使用することです。ジャバアプリケーション。

于 2013-05-27T23:34:09.767 に答える