Я могу сделать снимок экрана с изображением переднего плана, используя следующий код
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);
}
Я получаю снимки экрана с переднего плана, как показано ниже
Если вы заметили,на скриншоте есть дополнительное изображение на границе окна.
Я не хочу лишнюю часть изображения со своим скриншотом.
Можно ли каким-либо образом манипулировать
User32.INSTANCE.GetForegroundWindow ()
, чтобы получить снимок экрана без дополнительной части?
Мне кажется, что ответ в этой ссылке должен работать. В чем разница между GetClientRect и GetWindowRect в WinApi?
Но когда я заменяю GetWindowRect на GetClientRect, я получаю скриншот ниже:
В идеале у меня должен быть скриншот только приложения переднего плана.
Редактировать: Даниэль Виддис любезно нашел для меня похожий вопрос: getwindowrect-возвращает-размер-в том числе-невидимые-границы
Это имеетвозможный ответ, т.е. получить толщину границы в Windows 10 и отрегулировать эту толщину, чтобы получить скриншот, который я хочу.Но этот ответ использует DwmGetWindowAttribute(hwnd, DWMWA_EXTENDED_FRAME_BOUNDS, &frame, sizeof(RECT));
, который, возможно, C-код.
Если я найду способ определения толщины границ в Java, это решит мою проблему.