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

时间:2015-09-12 07:01:49

标签: java pointers winapi jna

我在我的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);
}

当我进入这种回调方法时,我得到了意想不到的结果:

    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位系统中使用上述代码,我可以捕获桌面(我可以从Pointer变量访问数据)。如果我在32位系统中使用相同的代码,我没有得到任何图像。您可以看到my whole code

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

供您参考。正如您在screenSkip.java中看到的那样,每当调用MagSetWindowSource函数时。调用MagImageScalingCallback(第80行)。

section of code

中的问题

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

64位系统 [![在此处输入图像说明] [2]] [2]

32位系统 enter image description here

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

至于您的要求,下图显示了我的系统配置。

enter image description here

1 个答案:

答案 0 :(得分:1)

回调是正确的 - 除了使用已弃用的函数之外,代码中没有任何缺陷。

考虑使用:

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