Получить цвет одного пикселя с помощью JNA - PullRequest
2 голосов
/ 22 марта 2019

Я пытаюсь получить цвет пикселя на экране, но не могу найти метод с устойчивой частотой тиков.

Итак, первый вариант, который я попробовал, - это класс Robot вJava - просто в использовании, но просто недостаточно быстро.

Затем я нашел способ захвата снимков экрана с использованием JNA из этого поста .Немного потестировав и поиграв с кодом, я обнаружил, что могу почти получить то, что хотел, в основном, изменив эту строку:

GDI32Extra.INSTANCE.BitBlt(hdcMemDC, 0, 0, width, height, hdcWindow, 0, 0, WinGDIExtra.SRCCOPY);

Единственная проблема заключается вчто он по-прежнему захватывает все окно, прежде чем выделять нужный вам один пиксель, и это просто кажется неправильным.Это немного замедляет частоту тиков.

Есть ли способ, которым я могу захватить только один пиксель, или я вынужден всегда сначала захватывать все окно?

Ядовольно неопытен с библиотеками JNA, так что, может быть, я просто упускаю что-то простое.Если бы кто-нибудь мог указать мне правильное направление, это было бы очень ценно.

Спасибо.

1 Ответ

1 голос
/ 23 марта 2019

Попробуйте добавить функцию GetPixel в свой собственный класс JNA.

public interface MyGDI32 extends com.sun.jna.platform.win32.GDI32 {
    MyGDI32 INSTANCE = Native.load("gdi32", MyGDI32.class, W32APIOptions.DEFAULT_OPTIONS);

    int GetPixel(HDC hdc, int x, int y);
}

Затем вызовите ее с помощью MyGDI32.INSTANCE.GetPixel().

Я не могу этого гарантироватьЭто будет немного быстрее, чем класс Robot, но он ответит на ваш вопрос, как "Получить цвет одного пикселя с помощью JNA."

Вам придется проанализировать DWORD (32-битныйint) возвращаемое значение в формате COLORREF: 0x00bbggrr.

...