在Windows中使用Java拍摄前景应用程序的屏幕快照,没有多余的优势

时间:2019-04-15 07:36:19

标签: java winapi jna

我可以使用以下代码拍摄前景图像的屏幕截图

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中查找边框粗细,那就可以解决我的问题。

1 个答案:

答案 0 :(得分:3)

GetClientRect

  

客户坐标指定左上角和右下角   客户区。因为客户坐标是相对于   窗口客户区的左上角,   左上角是(0,0)。

这是一个相对坐标系。

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

请注意,ClientToScreen仅接收POINT的参数(而不是RECT),并且您可以找到POINThere

编辑:

GetWindowRect将获得“额外”大小。但是,GetClientRect完全不包含它(以及标题栏,窗口边框等其他信息)。