Сделайте скриншот приложения переднего плана в Windows, используя Java без лишних граней - PullRequest
1 голос
/ 15 апреля 2019

Я могу сделать снимок экрана с изображением переднего плана, используя следующий код

void startScreencapture(){
    RECT dimensionsOfWindow = new RECT();
    User32.INSTANCE.GetWindowRect(User32.INSTANCE.GetForegroundWindow(), dimensionsOfWindow );//now in the dimensionsOfWindow you have the dimensions
    Robot robot = new Robot();
    buf = robot.createScreenCapture( dimensionsOfWindow.toRectangle() );
}

public interface User32 extends StdCallLibrary {
    User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
    HWND GetForegroundWindow();  // add this
    int GetWindowTextA(PointerType hWnd, byte[] lpString, int nMaxCount);
    public boolean GetWindowRect(HWND hWnd, RECT rect);
}

Я получаю снимки экрана с переднего плана, как показано ниже enter image description here

Если вы заметили,на скриншоте есть дополнительное изображение на границе окна.

Я не хочу лишнюю часть изображения со своим скриншотом.

Можно ли каким-либо образом манипулировать

User32.INSTANCE.GetForegroundWindow ()

, чтобы получить снимок экрана без дополнительной части?

Мне кажется, что ответ в этой ссылке должен работать. В чем разница между GetClientRect и GetWindowRect в WinApi?

Но когда я заменяю GetWindowRect на GetClientRect, я получаю скриншот ниже: enter image description here

В идеале у меня должен быть скриншот только приложения переднего плана.

Редактировать: Даниэль Виддис любезно нашел для меня похожий вопрос: getwindowrect-возвращает-размер-в том числе-невидимые-границы

Это имеетвозможный ответ, т.е. получить толщину границы в Windows 10 и отрегулировать эту толщину, чтобы получить скриншот, который я хочу.Но этот ответ использует DwmGetWindowAttribute(hwnd, DWMWA_EXTENDED_FRAME_BOUNDS, &frame, sizeof(RECT));, который, возможно, C-код.

Если я найду способ определения толщины границ в Java, это решит мою проблему.

1 Ответ

3 голосов
/ 16 апреля 2019

GetClientRect :

Клиентские координаты указывают верхний левый и нижний правый углы клиентской области.Поскольку координаты клиента относятся к верхнему левому углу клиентской области окна, координаты верхнего левого угла равны (0,0).

Этоотносительная система координат.

Вы также должны вызвать ClientToScreen для преобразования клиентской координаты в экранную координату.

Обратите внимание, что ClientToScreen принимает только параметр POINT(не RECT), и вы можете найти POINT class здесь .

EDIT:

GetWindowRect получит «дополнительный» размер.Однако GetClientRect точно не включает его (и другую дополнительную информацию, такую ​​как строка заголовка, граница окна и т. Д.).

...