我如何正确使用JNA来映射`MagImageScalingCallback`?

我在我的Java项目中使用了jna.jar,jna-3.2.5.jar和jna-3.3.0-platform.jar。

这是我想复制的Winapi函数。

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

这是我的Java代码

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

当我进入callback的这个方法,我得到意想不到的结果:

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

这个表格解释了当我改变variables的数据types时,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位系统中使用上述代码,我可以捕获桌面(我可以访问指针variables中的数据)。 如果我在32位系统中使用相同的代码,我没有得到任何图像。 你可以看到我的整个代码

为什么我的代码中的错误? 我该如何解决这个问题?

供你参考。 正如你在screenSkip.java看到的,每当调用MagSetWindowSource函数。 MagImageScalingCallback(在第80行)被调用。

代码的这一部分有问题

如果我在64位系统上运行这个代码, srcdatadestdata将保存桌面的整数像素数组(如果我将它保存为图像,它会捕获桌面)。 但是,如果我在32位系统上运行相同的代码,这两个variables数组像素值总是为零(如果我保存图像,它总是黑色)

64位系统[![在这里input图片描述] [2]] [2]

32位系统 在这里输入图像说明

@ david-heffernan我在32位系统上运行这个代码。 我知道The Magnification API is not supported under WOW64; 。 这意味着32位的放大应用程序在32位系统上工作,而64位的放大应用程序在64位系统上工作。 请停止评论,放大API不适用于WOW64,并尝试在32位系统上执行此代码。

至于你的要求,下面的图片显示了我的系统的configuration。

在这里输入图像说明

callback是正确的 – 你的代码中没有缺陷,除了你正在使用弃用的函数。

考虑使用这个:

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