2015-09-12 19 views
43

Java projemde jna.jar, jna-3.2.5.jar ve jna-3.3.0-platform.jar kullanıyorum.JNA'yı kullanarak bir "MagImageScalingCallback" öğesini nasıl düzgün şekilde eşleştirebilirim?

Çoğaltmak istediğim Winapi işlevi budur.

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

Bu tablo kokan ne çalışıyor ve ne olduğunu açıklıyor:

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

Bu

ben geri arama bu yöntem haline geldiğinizde, ben beklenmedik sonuçlar elde

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

benim Java kodu Değişkenlerin veri tipini değiştirdiğimde 32 bit ve 64 bit sistemde çalışıyorum.

+--------------+--------------+-------------+-------------+ 
| 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 | 
+--------------+--------------+-------------+-------------+ 

Çalışmıyor

Ben 64 bit sistemde yukarıdaki kodu kullanırsam, masaüstü yakalayabilir (I verilere erişebilir sonucu tamamen siyah bir görüntü anlamına geliyor İşaretçi değişkeni). Aynı kodu 32 bit sistemde kullanırsam herhangi bir görüntü almıyorum. Görüyorsunuz, hata neden kodumda? Bunu nasıl düzeltebilirim? Bilgileriniz için

. Gördüğünüz gibi, screenSkip.java, Ne zaman MagSetWindowSource işlevi çağrılır. MagImageScalingCallback (80 satırında) denir. Bu section of code

yılında

Sorunları Ben 64 bit sistemde srcdata Bu kodu çalıştırırsanız ve destdata Masaüstü tamsayı piksel dizisi düzenleyecek (Ben görüntü olarak bu kaydederseniz, masaüstü yakalar). Ancak, aynı kodu 32 bit sistemde çalıştırırsam, her ikisi de değişken dizi piksel değeri her zaman sıfırdır (Görüntüyü kaydedersem, her zaman siyah olur)

64 bit sistem [! [Resim açıklamasını buraya girin] [2] ]] [2]

32 bit sistem david-Heffernan @ enter image description here

bir 32-bit bir sistemde bu kodu çalıştıran. The Magnification API is not supported under WOW64;'u biliyorum. Hangi 32-bit büyütme uygulaması 32-bit sistem üzerinde çalışır ve 64-bit büyütme uygulaması 64-bit bir sistem üzerinde çalışır. Lütfen büyütme API'sinin WOW64'te çalışmadığını ve bu kodu 32 bitlik bir sistemde çalıştırmayı denemeyi bırakın.

İsteğiniz için aşağıdaki resimde Sistemimin yapılandırması gösterilmektedir.

enter image description here

+0

Eğer çoğaltmak istediğiniz 'C' deyim nedir?'struct' kullanımı, parametreler için ve toplama alanlarındaki değer (' struct') için referans ('struct *') şeklindedir. Java 'Structure' etiketleme arayüzleri (ByValue', ByReference') tamamlayıcı sözleşmeyi zorlamak için vardır. Diğer tüm değerler değer tarafından geçirilir ve bir değerin "adresini" iletmeyi kolaylaştırmak için "com.sun.jna.ptr" paketinde bir dizi ByReference uygulaması vardır. – technomage

+0

@technomage Soruyu güncelledim. Anlamadıysan lütfen bana ping. – Vishnu

+0

'Pointer' her zaman değere göre iletilir. İster 64, ister 32 bit olsun, eğer yerel imza, bir yapıya değer sorarsa, onu değere göre iletmeniz gerekir (yalnızca bir * struct * 'komutunun, 64-bit durumunuzda çalıştığı için Derleyici küçük 'struct' değerlerini nasıl geçirir? – technomage

cevap

1

geri doğru - eğer kaldırılmış işlevleri kullanarak vardır yanında Kodunuzdaki hiçbir kusur yoktur.

bu kullanmayı düşünün:

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(); 
    } 
+0

Bazı pencerelerin yakalanmasından atlanmasını istiyorum. Cevabınız çok temel bir koddur. – Vishnu

+0

kodun bazı bölümlerini yakalayabilmek için dikdörtgeni belirlemek için kullanabilirsiniz. – bebbo

İlgili konular