gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:41:39 29 4
gpt4 key购买 nike

我在我的 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com