I am using jna.jar, jna-3.2.5.jar and jna-3.3.0-platform.jar in my Java Project.
This is the Winapi function I want to replicate.
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 );
This is my Java code
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); }
When I get into this method of the callback, I get unexpected results:
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; }
This table explains What works and what doesn't work in 32 bit and 64 bit system when I change the data type of the variables.
+--------------+--------------+-------------+-------------+ | 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 | +--------------+--------------+-------------+-------------+
Not working means a totally black image in the result
If I use the above code in a 64 bit system, I can capture the desktop(I can access the data from the Pointer variable). If I use the same code in 32 bit system, I am not getting any image. You can see my whole code
Why is the error in my code? How can I fix that?
For your Information. As you see in the screenSkip.java
, Whenever MagSetWindowSource function is called. MagImageScalingCallback(in line 80) is called.
Problems in this section of code
If I run this code on a 64 bit system srcdata
and destdata
will hold the array of integer pixels of the Desktop(If I save this as image, it captures the desktop). But if I run the same code on 32 bit system these both variable array pixel value is always zero(If I save the image, it is always black)
64 bit system
32 bit system
@david-heffernan I am running this code on a 32-bit system. I know The Magnification API is not supported under WOW64;
. Which means 32-bit magnification application works on a 32-bit system and 64-bit magnification application works on a 64-bit system. Please stop commenting that magnification API doesn't work on WOW64 and try to execute this code on a 32-bit system.
As for your request the below image shows the configuration of my System.
The callback is proper - there is no flaw in your code, besides you are using deprecated functions.
Consider using this:
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(); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With