2015-09-12 10 views
43

Tôi đang sử dụng jna.jar, jna-3.2.5.jar và jna-3.3.0-platform.jar trong Dự án Java của tôi.Làm cách nào để ánh xạ chính xác `MagImageScalingCallback` bằng JNA?

Đây là hàm Winapi mà tôi muốn sao chép.

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

Đây là mã Java của tôi

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

Khi tôi nhận được vào phương pháp này gọi lại, tôi nhận được kết quả bất ngờ:

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

bảng này giải thích gì làm việc và những gì doesn' t làm việc trong hệ thống 32 bit và 64 bit khi tôi thay đổi kiểu dữ liệu của các biến.

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

Không làm việc có nghĩa là một hình ảnh hoàn toàn đen trong kết quả

Nếu tôi sử dụng đoạn mã trên trong một hệ thống 64 bit, tôi có thể chụp màn hình (Tôi có thể truy cập dữ liệu từ Biến con trỏ). Nếu tôi sử dụng cùng một mã trong hệ thống 32 bit, tôi không nhận được bất kỳ hình ảnh nào. Bạn có thể xem my whole code

Tại sao lỗi trong mã của tôi? Lam sao tôi co thể sửa no?

Để biết thông tin của bạn. Như bạn thấy trong screenSkip.java, Bất cứ khi nào hàm MagSetWindowSource được gọi. MagImageScalingCallback (trong dòng 80) được gọi.

Vấn đề ở đây section of code

Nếu tôi chạy mã này trên một hệ thống 64 bit srcdatadestdata sẽ tổ chức tập hợp các điểm số nguyên của máy tính để bàn (Nếu tôi tiết kiệm này như hình ảnh, nó chụp màn hình). Nhưng nếu tôi chạy cùng một mã trên hệ thống 32 bit, cả hai giá trị mảng mảng biến đều luôn bằng không (Nếu tôi lưu hình ảnh, nó luôn luôn là màu đen)

Hệ thống 64 bit [! [Enter image description here] [2 ]] [2]

32 bit hệ thống enter image description here

@ david-Heffernan tôi đang chạy mã này trên một hệ thống 32-bit. Tôi biết The Magnification API is not supported under WOW64;. Điều này có nghĩa là ứng dụng phóng đại 32 bit hoạt động trên hệ thống 32 bit và ứng dụng phóng đại 64 bit hoạt động trên hệ thống 64 bit. Vui lòng ngừng nhận xét rằng API phóng đại không hoạt động trên WOW64 và cố gắng thực thi mã này trên hệ thống 32 bit.

Đối với yêu cầu của bạn, hình ảnh bên dưới hiển thị cấu hình của Hệ thống của tôi.

enter image description here

+0

'cái C' ngữ bạn đang cố gắng để tái tạo là gì?Xử lý 'struct' là tham chiếu (' struct * ') cho các tham số và theo giá trị (' struct') trong các trường tổng hợp. Các giao diện gắn thẻ 'Structure' của Java (' ByValue', 'ByReference') có sẵn để bắt buộc quy ước bổ sung. Tất cả các giá trị khác được truyền theo giá trị và tồn tại một loạt các triển khai 'ByReference' trong gói' com.sun.jna.ptr' để tạo thuận lợi cho việc truyền "địa chỉ của" một giá trị. – technomage

+0

@technomage Tôi đã cập nhật câu hỏi. Vui lòng ping cho tôi nếu bạn không hiểu. – Vishnu

+0

'Con trỏ' luôn được truyền theo giá trị. Cho dù 64- hoặc 32-bit, nếu chữ ký gốc yêu cầu một struct theo giá trị, bạn cần truyền nó theo giá trị (chỉ có khả năng là đi qua một 'struct *' đã xảy ra để làm việc trong trường hợp 64-bit của bạn, do cách trình biên dịch xử lý các giá trị 'struct' nhỏ. – technomage

Trả lời

1

Các callback là thích hợp - không có lỗ hổng trong mã của bạn, bên cạnh bạn đang sử dụng chức năng phản đối.

xem xét sử dụng này:

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

Tôi muốn một số cửa sổ bị bỏ qua khi chụp. Câu trả lời của bạn là một mã rất cơ bản. – Vishnu

+0

bạn vẫn có thể sử dụng một số phần của mã để xác định hình chữ nhật cần lấy. – bebbo

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