Подтвердить что ты не робот

Как правильно сопоставить "MagImageScalingCallback" с помощью JNA?

Я использую 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]

32-битная система введите описание изображения здесь

@david-heffernan Я запускаю этот код в 32-битной системе. Я знаю The Magnification API is not supported under WOW64;. Это означает, что приложение с 32-разрядным увеличением работает на 32-битной системе, а приложение с 64-битным увеличением работает на 64-битной системе. Пожалуйста, прекратите комментировать, что API увеличения не работает на WOW64 и пытается выполнить этот код в 32-разрядной системе.

Что касается вашего запроса, на приведенном ниже рисунке показана конфигурация моей системы.

введите описание изображения здесь

4b9b3361

Ответ 1

Обратный вызов правильный - в коде нет недостатков, кроме того вы используете устаревшие функции.

Подумайте об этом:

    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();
    }