2012-11-13 5 views
9

मैं अपने जावा डेबूटस्ट्रैप में एक स्क्रीन घटना पर प्रतिक्रिया करने के लिए चाहते हैं तो मैं अपने वास्तविक स्क्रीन में एक छवि लगाना चाहते हैं। मैंने रोबोट वर्ग से स्क्रीनशॉट प्राप्त करने के लिए एक विधि लिखने की कोशिश की और फिर पिक्सल खोजें - लेकिन यह लंबे समय तक चल रहा था।उपयोग ImageSearchDll.dll जावा (AutoIt से) में संपादित करें: JNA

मैं जानता हूँ कि AutoIt में एक बाहरी DLL कि यह काम बहुत अच्छी है और अब मैं यह जावा में चल पाने के लिए करने की कोशिश की है कि वहाँ ... लेकिन मैं अटक कर रहा हूँ:/

.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 तरह बातें करने की कोशिश की, लेकिन मैं यह काम नहीं कर प्राप्त कर सकते हैं। मैंने ऑटोआईटीएक्स को जावा में चल रहे ऑटोआईट फ़ंक्शंस को प्राप्त करने का भी प्रयास किया लेकिन यह शामिल के साथ काम नहीं करता है। क्या आप मेरी मदद कर सकते हैं?

संपादित करें: ठीक है मैंने किया एक और 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 

तुम मुझे कि ठीक करने में सहायता कर सकते हैं?

+0

आप समारोह आप कॉल करने के लिए प्रयास कर रहे हैं के लिए एक वास्तविक प्रोटोटाइप (अधिमानतः सी) है? अपने मूल _ImageSearchArea समारोह में "ByRef" सज्जाकार सूचित करते हैं कि चित्रखोज उम्मीद कर रही है 'पूर्णांक *' उन मापदंडों के लिए, नहीं 'int' प्रतीत होता है। जेएनए में इसी प्रकार का प्रकार 'IntByReference' है। – technomage

उत्तर

1

आपके लेने के पथ का एक विकल्प Runtime.getRuntime().exec() का उपयोग करने के लिए एक अनुप्रयोग (सी, ऑटोिट स्क्रिप्ट इत्यादि) बनाने के लिए है जो छवियों को खोजता है और उनके बीच संचार के लिए फ़ाइल आधारित/मतदान पद्धति (या मानक आउटपुट के माध्यम से) का उपयोग करता है। अपने परिणाम अपने जावा एप्लिकेशन में प्राप्त करें।

संबंधित मुद्दे