2012-11-13 32 views
9

Tôi muốn phản ứng trên một sự kiện màn hình trong Chương trình Java của tôi vì vậy tôi muốn tìm một Hình ảnh trong màn hình thực tế của tôi. Tôi đã cố gắng viết một phương thức để có được một Ảnh chụp màn hình từ lớp robot và sau đó tìm kiếm các điểm ảnh - nhưng nó mất nhiều thời gian.Sử dụng ImageSearchDll.dll trong Java (từ AutoIt) chỉnh sửa: JNA

Tôi biết rằng trong AutoIt có một DLL bên ngoài mà làm công việc này khá tốt và bây giờ tôi đã cố gắng để làm cho nó chạy trong java ... Nhưng tôi đang mắc kẹt:/

Các .dll được gọi trong AutoIt Bao gồm như sau:

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

và:

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 

tôi đã dll và thử những thứ như jna nhưng tôi không thể làm cho nó làm việc. Tôi cũng đã thử AutoItX để có được AutoIt Chức năng chạy trong Java nhưng nó không hoạt động với bao gồm. Bạn có thể giúp tôi được không?

chỉnh sửa: Ok tôi đã thử một lần nữa trên JNA và bây giờ tôi nhận được một chuỗi trở lại - nhưng String có nghĩa là lỗi. Có vấn đề gì? Tôi có một giao diện:

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

và tôi gọi nó là như thế này:

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

tôi luôn luôn nhận được "0" trở lại nơi nghĩa Lỗi hoặc không tìm thấy như tôi có thể nhìn thấy trong tập tin AutoIt:

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

Bạn có thể giúp tôi khắc phục điều đó không?

+0

Bạn có mẫu thử nghiệm thực tế (tốt nhất là C) cho hàm bạn đang cố gắng gọi không? Các trang trí "ByRef" trong hàm _ImageSearchArea ban đầu của bạn dường như ngụ ý rằng ImageSearch đang mong đợi 'int *' cho các tham số đó, không phải 'int'. Kiểu tương ứng trong JNA là 'IntByReference'. – technomage

Trả lời

1

Một cách thay thế cho đường dẫn mà bạn đang sử dụng là sử dụng Runtime.getRuntime().exec() để sinh ra ứng dụng (c, tự động tập lệnh, v.v.) để tìm kiếm và sử dụng phương pháp dựa trên/bỏ phiếu (hoặc thông qua đầu ra Chuẩn) để liên lạc giữa chúng đưa kết quả của bạn vào ứng dụng java của bạn.

Các vấn đề liên quan