如何使用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);
}
当我进入回调的这个方法时,我得到意想不到的结果:
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位系统中使用相同的代码,我没有得到任何图像。你可以看到我的整个代码
为什么我的代码中存在错误?我该如何解决这个问题?
供您参考。正如您在 中看到的,每当调用 MagSetWindowSource 函数时。MagImageScalingCallback(在第80行中)被称为MagImageScalingCallback。screenSkip.java
此部分代码中的问题
如果我在64位系统上运行此代码,并将保存桌面的整数像素数组(如果我将其另存为图像,它将捕获桌面)。但是如果我在32位系统上运行相同的代码,这些变量数组像素值总是零(如果我保存图像,它总是黑色的)srcdata
destdata
@david-heffernan,我正在32位系统上运行此代码。我知道。这意味着 32 位放大应用程序在 32 位系统上工作,64 位放大应用程序在 64 位系统上工作。请停止评论放大 API 在 WOW64 上不起作用,并尝试在 32 位系统上执行此代码。The Magnification API is not supported under WOW64;
至于您的请求,下图显示了我的系统的配置。