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

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

Not working means a totally black image in the result

如果我在 64 位系统中使用上述代码,我可以捕获桌面(我可以从 Pointer 变量中访问数据)。如果我在 32 位系统中使用相同的代码,我不会得到任何图像。可以看my whole code

为什么我的代码中有错误?我该如何解决?

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

section of code 中的问题

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

64 位系统 enter image description here

32 位系统 enter image description here

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

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

enter image description here

最佳答案

回调是正确的——你的代码没有任何缺陷,除了你使用了不推荐使用的函数。

考虑使用这个:

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

关于java - 如何使用 JNA 正确映射 `MagImageScalingCallback`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32536171/

相关文章:

c - 是否可以从二维数组中为结构分配数组

c++ - 是否可以在 Win32 编辑控件中突出显示文本?

winapi - 如何通过WinApi判断默认网卡?

java - spring mvc转发到jsp

c++ - 引用是如何在内部实现的?

java - 如何在java中为zip存档启用密码?

c++ - 如何从另一个对象分配给指针函数数组?

c++ - WaitForMultipleObjects 失败 C++

java - JSP 不在 Spring 中显示模型中的对象

Java - 需要有关如何对此类进行单元测试的建议