gpt4 book ai didi

java - 使用 Java 在没有额外边缘的情况下在 Windows 中截取前台应用程序屏幕截图

转载 作者:行者123 更新时间:2023-11-29 04:09:57 26 4
gpt4 key购买 nike

我可以使用下面的代码截取前景图像

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

这样我就可以得到没有多余部分的屏幕截图?

我觉得这个链接中的答案应该有效。 What is the difference between GetClientRect and GetWindowRect in WinApi?

但是当我用 GetClientRect 替换 GetWindowRect 时,我得到以下屏幕截图: enter image description here

理想情况下,我应该只获得前台应用程序的屏幕截图。

编辑:Daniel Widdis 好心地为我找到了一个类似的问题:getwindowrect-returns-a-size-including-invisible-borders

这有一个可能的答案,即获取 Windows 10 中的边框厚度并调整此厚度以获得我想要的屏幕截图。但是这个答案使用DwmGetWindowAttribute(hwnd, DWMWA_EXTENDED_FRAME_BOUNDS, &frame, sizeof(RECT)); 这可能是 C 代码。

如果我能找到如何在 Java 中查找边框粗细,它就会解决我的问题。

最佳答案

GetClientRect :

The client coordinates specify the upper-left and lower-right corners of the client area. Because client coordinates are relative to the upper-left corner of a window's client area, the coordinates of the upper-left corner are (0,0).

这是一个相对坐标系。

您还应该调用 ClientToScreen将客户端坐标转换为屏幕坐标。

注意ClientToScreen只接收POINT的参数(不是RECT),你可以找到POINThere .

编辑:

GetWindowRect 将获得“额外”尺寸。但是,GetClientRect 确实不包含它(以及其他额外信息,如标题栏、窗口边框等)。

关于java - 使用 Java 在没有额外边缘的情况下在 Windows 中截取前台应用程序屏幕截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55684450/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com