java - मैं जेएनए का उपयोग करके 'MagImageScalingCallback` को सही तरीके से कैसे मैप कर सकता हूं?



pointers winapi (1)

मैं अपने जावा प्रोजेक्ट में jna.jar, jna-3.2.5.jar और jna-3.3.0-platform.jar का उपयोग कर रहा हूं।

यह विनपी फ़ंक्शन है जिसे मैं दोहराना चाहता हूं।

BOOL WINAPI MagImageScalingCallback(
  _In_  HWND           hwnd,
  _In_  void           *srcdata,
  _In_  MAGIMAGEHEADER srcheader,
  _Out_ void           *destdata,
  _In_  MAGIMAGEHEADER destheader,
  _In_  RECT           unclipped,
  _In_  RECT           clipped,
  _In_  HRGN           dirty
);

यह मेरा जावा कोड है

public interface MagImageScalingCallback extends StdCallLibrary.StdCallCallback{
    public boolean MagImageScalingCallback(HWND hwnd,
            Pointer srcdata,
            MAGIMAGEHEADER.ByValue srcheader,
            Pointer destdata,
            MAGIMAGEHEADER.ByValue destheader,
            RectByValue source,
            RectByValue clipped,
            HRGN dirty);
}

जब मैं कॉलबैक के इस तरीके में आता हूं, तो मुझे अप्रत्याशित परिणाम मिलते हैं:

    public boolean MagImageScalingCallback(HWND hwnd, Pointer srcdata,
            MAGIMAGEHEADER.ByValue srcheader, Pointer destdata,
            MAGIMAGEHEADER.ByValue destheader, RectByValue source, RectByValue clipped, HRGN dirty) {
        image.setRGB(0, 0, srcheader.width, srcheader.height, srcdata.getIntArray(0, srcheader.width * srcheader.height ), 0, srcheader.width);
        return true;
    }

यह तालिका बताती है कि जब मैं चर के डेटा प्रकार को बदलता हूं तो 32 बिट और 64 बिट सिस्टम में क्या काम करता है और क्या काम नहीं करता है।

+--------------+--------------+-------------+-------------+
| Parameter    | Data type    |   64 bit    |   32 bit    |
+--------------+--------------+-------------+-------------+
| source       | WinDef.RECT  |   Working   | Not Working |
| clipped      | WinDef.RECT  |   Working   | Not Working |
| source       | RectByValue  |   Working   |   Working   |
| source       | RectByValue  |   Working   |   Working   |
| srcdata      | Pointer      |   Working   | Not Working |
| destdata     | Pointer      |   Working   | Not Working |
+--------------+--------------+-------------+-------------+

काम नहीं करना परिणाम में पूरी तरह से काले छवि का मतलब है

यदि मैं 64 बिट सिस्टम में उपरोक्त कोड का उपयोग करता हूं, तो मैं डेस्कटॉप पर कब्जा कर सकता हूं (मैं पॉइंटर चर से डेटा तक पहुंच सकता हूं)। अगर मैं 32 बिट सिस्टम में एक ही कोड का उपयोग करता हूं, तो मुझे कोई छवि नहीं मिल रही है। आप मेरा पूरा कोड देख सकते हैं

मेरे कोड में त्रुटि क्यों है? मैं कैसे इसे ठीक कर सकता हूं?

आपकी जानकारी के लिए। जैसा कि आप screenSkip.java में देखते हैं, जब भी मैग्सेटविंडोसोर्स फ़ंक्शन कहा जाता है। MagImageScalingCallback (लाइन 80 में) कहा जाता है।

कोड के इस खंड में समस्याएं

यदि मैं इस कोड को 64 बिट सिस्टम srcdata और destdata डेस्कटॉप के पूर्णांक पिक्सल की सरणी destdata (यदि मैं इसे छवि के रूप में सहेजता हूं, तो यह डेस्कटॉप को कैप्चर करता है)। लेकिन अगर मैं 32 बिट सिस्टम पर एक ही कोड चलाता हूं तो ये दोनों चरणीय सरणी पिक्सेल मान हमेशा शून्य होता है (यदि मैं छवि को सहेजता हूं, तो यह हमेशा काला होता है)

64 बिट सिस्टम [! [यहां छवि विवरण दर्ज करें] [2]] [2]

32 बिट सिस्टम

@ डेविड-हेफरनन मैं इस कोड को 32-बिट सिस्टम पर चला रहा हूं। मुझे पता है The Magnification API is not supported under WOW64; । जिसका मतलब 32-बिट आवर्धन अनुप्रयोग 32-बिट सिस्टम पर काम करता है और 64-बिट आवर्धन अनुप्रयोग 64-बिट सिस्टम पर काम करता है। कृपया टिप्पणी करना बंद करें कि आवर्धन API WOW64 पर काम नहीं करता है और 32-बिट सिस्टम पर इस कोड को निष्पादित करने का प्रयास करता है।

आपके अनुरोध के लिए नीचे दी गई छवि मेरे सिस्टम की कॉन्फ़िगरेशन दिखाती है।


कॉलबैक उचित है - आपके कोड में कोई दोष नहीं है, इसके अलावा आप बहिष्कृत कार्यों का उपयोग कर रहे हैं।

इसका उपयोग करने पर विचार करें:

    try {
        Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
        BufferedImage  capture = new Robot().createScreenCapture(screenRect);
        ImageIO.write(capture, "JPEG", new File("printed1.jpg"));
    } catch (Exception e) {
        e.printStackTrace();
    }




jna