2012-11-13 7 views
9

Chcę reagować na zdarzenie na ekranie w moim programie Java, więc chcę znaleźć obraz na moim rzeczywistym ekranie. Próbowałem napisać metodę, aby uzyskać zrzut ekranu z klasy robotów, a następnie przeszukać piksele - ale trwało to zbyt długo.Użyj ImageSearchDll.dll w Java (z AutoIt) edit: JNA

Wiem, że w AutoIt jest zewnętrzny DLL, że robi to zadanie bardzo dobrze i teraz starałem się, że działa w Java ... Ale siedzę:/

.dll nazywa się w AutoIt Zawiera tak:

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

i:

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 

mam dll i próbował rzeczy jak JNA, ale nie mogę dostać pracy. Próbowałem także AutoItX, aby uzyskać funkcje AutoIt działające w Javie, ale nie działa z włączeniami. Możesz mi pomóc?

edytuj: OK, zrobiłem kolejną próbę na JNA, a teraz otrzymuję String - ale ciąg oznacza błąd. Jaki jest problem? Mam Interface

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); 
} 

i nazywam to tak:

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"); 

ja zawsze "0" z powrotem, gdzie oznacza błąd lub nie znaleziono jak widzę w pliku Auto:

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

Czy możesz mi pomóc to rozwiązać?

+0

Czy masz rzeczywisty prototyp (najlepiej C) dla funkcji, do której chcesz zadzwonić? Dekoratory "ByRef" w oryginalnej funkcji _ImageSearchArea mogą sugerować, że ImageSearch oczekuje "int *" dla tych parametrów, a nie "int". Odpowiedni typ w JNA to 'IntByReference'. – technomage

Odpowiedz

1

Alternatywą dla ścieżki, którą bierzesz, jest użycie Runtime.getRuntime().exec() do odrodzenia aplikacji (c, auto-skryptu itp.), Która wykonuje wyszukiwanie obrazu i wykorzystuje metodologię opartą na plikach/pobieraniu (lub przez standardowe wyjście) do komunikacji między nimi. pobierz wyniki do aplikacji java.

Powiązane problemy