我在我的 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 位系统上运行此代码 srcdata
和 destdata
将保存桌面的整数像素数组(如果我将其保存为图像,它会捕获桌面)。但是如果我在 32 位系统上运行相同的代码,这两个变量数组的像素值总是为零(如果我保存图像,它总是黑色的)
@david-heffernan 我在 32 位系统上运行此代码。我知道WOW64 不支持放大API;
。这意味着 32 位放大应用程序适用于 32 位系统,而 64 位放大应用程序适用于 64 位系统。请停止评论放大 API 不适用于 WOW64 并尝试在 32 位系统上执行此代码。
根据您的要求,下图显示了我系统的配置。
最佳答案
回调是正确的——你的代码没有任何缺陷,除了你使用了不推荐使用的函数。
考虑使用这个:
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/