Я использую jna.jar, jna-3.2.5.jar и jna-3.3.0-platform.jar в своем проекте Java.
Это функция 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-битной системе, я могу захватить рабочий стол (я могу получить доступ к данным из переменной указателя). Если я использую тот же код в 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-разрядной системе.
Что касается вашего запроса, на приведенном ниже рисунке показана конфигурация моей системы.