Vis*_*hnu 43 java winapi pointers 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
);
Run Code Online (Sandbox Code Playgroud)
这是我的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);
}
Run Code Online (Sandbox Code Playgroud)
当我进入这个回调方法时,我得到了意想不到的结果:
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;
}
Run Code Online (Sandbox Code Playgroud)
此表解释了当我更改变量的数据类型时,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 |
+--------------+--------------+-------------+-------------+
Run Code Online (Sandbox Code Playgroud)
不工作意味着结果中的全黑图像
如果我在64位系统中使用上面的代码,我可以捕获桌面(我可以从Pointer变量访问数据).如果我在32位系统中使用相同的代码,我没有得到任何图像.你可以看到我的整个代码
为什么我的代码中出现错误?我该如何解决这个问题?
供您参考.如您所见screenSkip.java,每当调用MagSetWindowSource函数时.调用MagImageScalingCallback(第80行).
这段代码中的问题
如果我运行一个64位系统上的代码srcdata和destdata将保持桌面整数像素阵列(如果我保存此作为图像,它抓住了桌面).但是如果我在32位系统上运行相同的代码,这两个可变数组像素值总是为零(如果我保存图像,它总是黑色)
64位系统[![在此处输入图像说明] [2]] [2]
@ david-heffernan我在32位系统上运行此代码.我知道The Magnification API is not supported under WOW64;.这意味着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();
}
Run Code Online (Sandbox Code Playgroud)